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