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