• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "sensorlist.h"
18 
19 #include <math.h>
20 
21 #include "hubdefs.h"
22 
23 using namespace android;
24 
25 const int kVersion = 1;
26 
27 const float kMinSampleRateHzAccel = 0.8125f;
28 const float kMaxSampleRateHzAccel = 416.0f;
29 const float kAccelRangeG = 8.0f;
30 extern const float kScaleAccel = 0.00239364f;
31 
32 const float kMinSampleRateHzGyro = 0.8125f;
33 const float kMaxSampleRateHzGyro = 416.0f;
34 
35 const float kMinSampleRateHzMag = 0.8125f;
36 const float kMaxSampleRateHzMag = 104.0f;
37 extern const float kScaleMag = 0.15f;
38 
39 const float kMinSampleRateHzPressure = 1.0f;
40 const float kMaxSampleRateHzPressure = 75.0f;
41 
42 const float kMinSampleRateHzTemperature = 1.0f;
43 const float kMaxSampleRateHzTemperature = 75.0f;
44 
45 const float kMinSampleRateHzHumidity = 1.0f;
46 const float kMaxSampleRateHzHumidity = 12.5f;
47 
48 #ifdef HAVE_VL53L0X_DRIVER
49 const float kMinSampleRateHzProximity = 0.1f;
50 const float kMaxSampleRateHzProximity = 5.0f;
51 #endif
52 
53 const float kMinSampleRateHzLight = 10.0f;
54 const float kMaxSampleRateHzLight = 10.0f;
55 
56 const float kMinSampleRateHzOrientation = 12.5f;
57 const float kMaxSampleRateHzOrientation = 200.0f;
58 
59 #define MINDELAY(x) ((int32_t)ceil(1.0E6f / (x)))
60 
61 #ifdef DIRECT_REPORT_ENABLED
62 constexpr uint32_t kDirectReportFlagAccel = (
63         // support up to rate level fast (nominal 200Hz);
64         (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
65         // support ashmem and gralloc direct channel
66         | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
67 constexpr uint32_t kDirectReportFlagGyro = (
68         // support up to rate level fast (nominal 200Hz);
69         (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
70         // support ashmem and gralloc direct channel
71         | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
72 constexpr uint32_t kDirectReportFlagMag = (
73         // support up to rate level normal (nominal 50Hz);
74         (SENSOR_DIRECT_RATE_NORMAL << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
75         // support ashmem and gralloc direct channel
76         | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
77 #else
78 constexpr uint32_t kDirectReportFlagAccel = 0;
79 constexpr uint32_t kDirectReportFlagGyro = 0;
80 constexpr uint32_t kDirectReportFlagMag = 0;
81 #endif
82 
83 /*
84  * The following max count is determined by the total number of blocks
85  * available in the shared nanohub buffer and number of samples each type of
86  * event can hold within a buffer block.
87  * For argonkey's case, there are 193 blocks in the shared sensor buffer and
88  * each block can hold 30 OneAxis Samples, 15 ThreeAxis Samples or 24
89  * RawThreeAxis Samples.
90  */
91 #ifdef HAVE_VL53L0X_DRIVER
92 const int kMaxOneAxisEventCount = 193 * 30;
93 const int kMaxThreeAxisEventCount = 193 * 15;
94 const int kMaxRawThreeAxisEventCount = 193 * 24;
95 #else
96 const int kMaxOneAxisEventCount = 183 * 30;
97 const int kMaxThreeAxisEventCount = 183 * 15;
98 const int kMaxRawThreeAxisEventCount = 183 * 24;
99 #endif
100 
101 const int kMinFifoReservedEventCount = 20;
102 
103 extern const sensor_t kSensorList[] = {
104 #ifdef HAVE_VL53L0X_DRIVER
105         {"VL53L0X Proximity Sensor",
106          "STMicroelectronics",
107          kVersion,
108          COMMS_SENSOR_PROXIMITY,
109          SENSOR_TYPE_PROXIMITY,
110          5.0f,                                 // maxRange (cm)
111          1.0f,                                 // resolution (cm)
112          0.0f,                                 // XXX power
113          MINDELAY(kMaxSampleRateHzProximity),  // minDelay
114          300,                                  // XXX fifoReservedEventCount
115          kMaxOneAxisEventCount,                // XXX fifoMaxEventCount
116          SENSOR_STRING_TYPE_PROXIMITY,
117          "",                                          // requiredPermission
118          (long)(1.0E6f / kMinSampleRateHzProximity),  // maxDelay
119          SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE,
120          {NULL, NULL}},
121 #endif
122         {"ILS29034 Light Sensor",
123          "Intersil",
124          kVersion,
125          COMMS_SENSOR_LIGHT,
126          SENSOR_TYPE_LIGHT,
127          43000.0f,                         // maxRange (lx)
128          10.0f,                            // XXX resolution (lx)
129          0.0f,                             // XXX power
130          MINDELAY(kMaxSampleRateHzLight),  // minDelay
131          kMinFifoReservedEventCount,       // XXX fifoReservedEventCount
132          kMaxOneAxisEventCount,            // XXX fifoMaxEventCount
133          SENSOR_STRING_TYPE_LIGHT,
134          "",                                      // requiredPermission
135          (long)(1.0E6f / kMinSampleRateHzLight),  // maxDelay
136          SENSOR_FLAG_ON_CHANGE_MODE,
137          {NULL, NULL}},
138         {"LSM6DSL accelerometer",
139          "STMicroelectronics",
140          kVersion,
141          COMMS_SENSOR_ACCEL,
142          SENSOR_TYPE_ACCELEROMETER,
143          GRAVITY_EARTH* kAccelRangeG,      // maxRange
144          kScaleAccel,                      // resolution
145          0.0f,                             // XXX power
146          MINDELAY(kMaxSampleRateHzAccel),  // minDelay
147          3000,                             // XXX fifoReservedEventCount
148          kMaxRawThreeAxisEventCount,       // XXX fifoMaxEventCount
149          SENSOR_STRING_TYPE_ACCELEROMETER,
150          "",                                      // requiredPermission
151          (long)(1.0E6f / kMinSampleRateHzAccel),  // maxDelay
152          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel,
153          {NULL, NULL}},
154         {"LSM6DSL accelerometer (uncalibrated)",
155          "STMicroelectronics",
156          kVersion,
157          COMMS_SENSOR_ACCEL_UNCALIBRATED,
158          SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED,
159          GRAVITY_EARTH* kAccelRangeG,      // maxRange
160          kScaleAccel,                      // resolution
161          0.0f,                             // XXX power
162          MINDELAY(kMaxSampleRateHzAccel),  // minDelay
163          3000,                             // XXX fifoReservedEventCount
164          kMaxRawThreeAxisEventCount,       // XXX fifoMaxEventCount
165          SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED,
166          "",                                      // requiredPermission
167          (long)(1.0E6f / kMinSampleRateHzAccel),  // maxDelay
168          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel,
169          {NULL, NULL}},
170         {"LSM6DSL gyroscope",
171          "STMicroelectronics",
172          kVersion,
173          COMMS_SENSOR_GYRO,
174          SENSOR_TYPE_GYROSCOPE,
175          2000.0f * M_PI / 180.0f,         // maxRange
176          0.07f * M_PI / 180.0f,           // resolution
177          0.0f,                            // XXX power
178          MINDELAY(kMaxSampleRateHzGyro),  // minDelay
179          kMinFifoReservedEventCount,      // XXX fifoReservedEventCount
180          kMaxThreeAxisEventCount,         // XXX fifoMaxEventCount
181          SENSOR_STRING_TYPE_GYROSCOPE,
182          "",                                     // requiredPermission
183          (long)(1.0E6f / kMinSampleRateHzGyro),  // maxDelay
184          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro,
185          {NULL, NULL}},
186         {"LSM6DSL gyroscope (uncalibrated)",
187          "STMicroelectronics",
188          kVersion,
189          COMMS_SENSOR_GYRO_UNCALIBRATED,
190          SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
191          2000.0f * M_PI / 180.0f,         // maxRange
192          0.07f * M_PI / 180.0f,           // resolution
193          0.0f,                            // XXX power
194          MINDELAY(kMaxSampleRateHzGyro),  // minDelay
195          kMinFifoReservedEventCount,      // XXX fifoReservedEventCount
196          kMaxThreeAxisEventCount,         // XXX fifoMaxEventCount
197          SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED,
198          "",                                     // requiredPermission
199          (long)(1.0E6f / kMinSampleRateHzGyro),  // maxDelay
200          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro,
201          {NULL, NULL}},
202         {"LIS2MDL magnetometer",
203          "STMicroelectronics",
204          kVersion,
205          COMMS_SENSOR_MAG,
206          SENSOR_TYPE_MAGNETIC_FIELD,
207          1300.0f,                        // XXX maxRange
208          kScaleMag,                      // XXX resolution
209          0.0f,                           // XXX power
210          MINDELAY(kMaxSampleRateHzMag),  // minDelay
211          600,                            // XXX fifoReservedEventCount
212          kMaxThreeAxisEventCount,        // XXX fifoMaxEventCount
213          SENSOR_STRING_TYPE_MAGNETIC_FIELD,
214          "",                                    // requiredPermission
215          (long)(1.0E6f / kMinSampleRateHzMag),  // maxDelay
216          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag,
217          {NULL, NULL}},
218         {"LIS2MDL magnetometer (uncalibrated)",
219          "STMicroelectronics",
220          kVersion,
221          COMMS_SENSOR_MAG_UNCALIBRATED,
222          SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
223          1300.0f,                        // XXX maxRange
224          kScaleMag,                      // XXX resolution
225          0.0f,                           // XXX power
226          MINDELAY(kMaxSampleRateHzMag),  // minDelay
227          600,                            // XXX fifoReservedEventCount
228          kMaxThreeAxisEventCount,        // XXX fifoMaxEventCount
229          SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
230          "",                                    // requiredPermission
231          (long)(1.0E6f / kMinSampleRateHzMag),  // maxDelay
232          SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag,
233          {NULL, NULL}},
234         {"LPS22HB pressure",
235          "STMicroelectronics",
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          MINDELAY(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         {"LPS22HB temperature",
251          "STMicroelectronics",
252          kVersion,
253          COMMS_SENSOR_AMBIENT_TEMPERATURE,
254          SENSOR_TYPE_AMBIENT_TEMPERATURE,
255          85.0f,                                  // maxRange (degC)
256          0.01,                                   // resolution (degC)
257          0.0f,                                   // XXX power
258          MINDELAY(kMaxSampleRateHzTemperature),  // minDelay
259          kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
260          kMaxOneAxisEventCount,                  // XXX fifoMaxEventCount
261          SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE,
262          "",                                            // requiredPermission
263          (long)(1.0E6f / kMinSampleRateHzTemperature),  // maxDelay
264          SENSOR_FLAG_CONTINUOUS_MODE,
265          {NULL, NULL}},
266         {"HTS221 humidity",
267          "STMicroelectronics",
268          kVersion,
269          COMMS_SENSOR_HUMIDITY,
270          SENSOR_TYPE_RELATIVE_HUMIDITY,
271          100.0f,                              // maxRange (%)
272          0.001f,                              // resolution (%)
273          0.0f,                                // XXX power
274          MINDELAY(kMaxSampleRateHzHumidity),  // minDelay
275          300,                                 // XXX fifoReservedEventCount
276          kMaxOneAxisEventCount,               // XXX fifoMaxEventCount
277          SENSOR_STRING_TYPE_RELATIVE_HUMIDITY,
278          "",                                         // requiredPermission
279          (long)(1.0E6f / kMinSampleRateHzHumidity),  // maxDelay
280          SENSOR_FLAG_CONTINUOUS_MODE,
281          {NULL, NULL}},
282         {"Orientation",
283          "Google",
284          kVersion,
285          COMMS_SENSOR_ORIENTATION,
286          SENSOR_TYPE_ORIENTATION,
287          360.0f,                                 // maxRange (deg)
288          1.0f,                                   // XXX resolution (deg)
289          0.0f,                                   // XXX power
290          MINDELAY(kMaxSampleRateHzOrientation),  // minDelay
291          kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
292          kMaxThreeAxisEventCount,                // XXX fifoMaxEventCount
293          SENSOR_STRING_TYPE_ORIENTATION,
294          "",                                            // requiredPermission
295          (long)(1.0E6f / kMinSampleRateHzOrientation),  // maxDelay
296          SENSOR_FLAG_CONTINUOUS_MODE,
297          {NULL, NULL}},
298         {"LSM6DSL Step detector",
299          "STMicroelectronics",
300          kVersion,
301          COMMS_SENSOR_STEP_DETECTOR,
302          SENSOR_TYPE_STEP_DETECTOR,
303          1.0f,                   // maxRange
304          1.0f,                   // XXX resolution
305          0.0f,                   // XXX power
306          0,                      // minDelay
307          100,                    // XXX fifoReservedEventCount
308          kMaxOneAxisEventCount,  // XXX fifoMaxEventCount
309          SENSOR_STRING_TYPE_STEP_DETECTOR,
310          "",  // requiredPermission
311          0,   // maxDelay
312          SENSOR_FLAG_SPECIAL_REPORTING_MODE,
313          {NULL, NULL}},
314         {"LSM6DSL Step counter",
315          "STMicroelectronics",
316          kVersion,
317          COMMS_SENSOR_STEP_COUNTER,
318          SENSOR_TYPE_STEP_COUNTER,
319          65535.0f,                    // XXX maxRange
320          1.0f,                        // resolution
321          0.0f,                        // XXX power
322          0,                           // minDelay
323          kMinFifoReservedEventCount,  // XXX fifoReservedEventCount
324          kMaxOneAxisEventCount,       // XXX fifoMaxEventCount
325          SENSOR_STRING_TYPE_STEP_COUNTER,
326          "",  // requiredPermission
327          0,   // maxDelay
328          SENSOR_FLAG_ON_CHANGE_MODE,
329          {NULL, NULL}},
330         {"LSM6DSL Significant motion",
331          "STMicroelectronics",
332          kVersion,
333          COMMS_SENSOR_SIGNIFICANT_MOTION,
334          SENSOR_TYPE_SIGNIFICANT_MOTION,
335          1.0f,  // maxRange
336          1.0f,  // XXX resolution
337          0.0f,  // XXX power
338          -1,    // minDelay
339          0,     // XXX fifoReservedEventCount
340          0,     // XXX fifoMaxEventCount
341          SENSOR_STRING_TYPE_SIGNIFICANT_MOTION,
342          "",  // requiredPermission
343          0,   // maxDelay
344          SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
345          {NULL, NULL}},
346         {"Gravity",
347          "Google",
348          kVersion,
349          COMMS_SENSOR_GRAVITY,
350          SENSOR_TYPE_GRAVITY,
351          1000.0f,                                // maxRange
352          1.0f,                                   // XXX resolution
353          0.0f,                                   // XXX power
354          MINDELAY(kMaxSampleRateHzOrientation),  // minDelay
355          kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
356          kMaxThreeAxisEventCount,                // XXX fifoMaxEventCount
357          SENSOR_STRING_TYPE_GRAVITY,
358          "",                                            // requiredPermission
359          (long)(1.0E6f / kMinSampleRateHzOrientation),  // maxDelay
360          SENSOR_FLAG_CONTINUOUS_MODE,
361          {NULL, NULL}},
362         {"Linear Acceleration",
363          "Google",
364          kVersion,
365          COMMS_SENSOR_LINEAR_ACCEL,
366          SENSOR_TYPE_LINEAR_ACCELERATION,
367          1000.0f,                                // maxRange
368          1.0f,                                   // XXX resolution
369          0.0f,                                   // XXX power
370          MINDELAY(kMaxSampleRateHzOrientation),  // minDelay
371          kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
372          kMaxThreeAxisEventCount,                // XXX fifoMaxEventCount
373          SENSOR_STRING_TYPE_LINEAR_ACCELERATION,
374          "",                                            // requiredPermission
375          (long)(1.0E6f / kMinSampleRateHzOrientation),  // maxDelay
376          SENSOR_FLAG_CONTINUOUS_MODE,
377          {NULL, NULL}},
378         {"Rotation Vector",
379          "Google",
380          kVersion,
381          COMMS_SENSOR_ROTATION_VECTOR,
382          SENSOR_TYPE_ROTATION_VECTOR,
383          1.0f,                                   // maxRange
384          0.001f,                                 // XXX resolution
385          0.0f,                                   // XXX power
386          MINDELAY(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         {"Geomagnetic Rotation Vector",
395          "Google",
396          kVersion,
397          COMMS_SENSOR_GEO_MAG,
398          SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
399          1.0f,                                   // maxRange
400          0.001f,                                 // XXX resolution
401          0.0f,                                   // XXX power
402          MINDELAY(kMaxSampleRateHzOrientation),  // minDelay
403          kMinFifoReservedEventCount,             // XXX fifoReservedEventCount
404          kMaxThreeAxisEventCount,                // XXX fifoMaxEventCount
405          SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
406          "",                                            // requiredPermission
407          (long)(1.0E6f / kMinSampleRateHzOrientation),  // maxDelay
408          SENSOR_FLAG_CONTINUOUS_MODE,
409          {NULL, NULL}},
410         {"Game Rotation Vector",
411          "Google",
412          kVersion,
413          COMMS_SENSOR_GAME_ROTATION_VECTOR,
414          SENSOR_TYPE_GAME_ROTATION_VECTOR,
415          1.0f,                                   // maxRange
416          0.001f,                                 // XXX resolution
417          0.0f,                                   // XXX power
418          MINDELAY(kMaxSampleRateHzOrientation),  // minDelay
419          300,                                    // XXX fifoReservedEventCount
420          kMaxThreeAxisEventCount,                // XXX fifoMaxEventCount
421          SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR,
422          "",                                            // requiredPermission
423          (long)(1.0E6f / kMinSampleRateHzOrientation),  // maxDelay
424          SENSOR_FLAG_CONTINUOUS_MODE,
425          {NULL, NULL}},
426         {"Tilt Detector",
427          "Google",
428          kVersion,
429          COMMS_SENSOR_TILT,
430          SENSOR_TYPE_TILT_DETECTOR,
431          1.0f,                        // maxRange
432          1.0f,                        // XXX resolution
433          0.0f,                        // XXX power
434          0,                           // minDelay
435          kMinFifoReservedEventCount,  // XXX fifoReservedEventCount
436          kMaxOneAxisEventCount,       // XXX fifoMaxEventCount
437          SENSOR_STRING_TYPE_TILT_DETECTOR,
438          "",  // requiredPermission
439          0,   // maxDelay
440          SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
441          {NULL, NULL}},
442         {"Device Orientation",
443          "Google",
444          kVersion,
445          COMMS_SENSOR_WINDOW_ORIENTATION,
446          SENSOR_TYPE_DEVICE_ORIENTATION,
447          3.0f,                        // maxRange
448          1.0f,                        // XXX resolution
449          0.1f,                        // XXX power
450          0,                           // minDelay
451          kMinFifoReservedEventCount,  // XXX fifoReservedEventCount
452          kMaxOneAxisEventCount,       // XXX fifoMaxEventCount
453          SENSOR_STRING_TYPE_DEVICE_ORIENTATION,
454          "",  // requiredPermission
455          0,   // maxDelay
456          SENSOR_FLAG_ON_CHANGE_MODE,
457          {NULL, NULL}},
458 };
459 
460 extern const size_t kSensorCount = sizeof(kSensorList) / sizeof(sensor_t);
461