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 #ifndef _CHRE_SENSOR_H_
18 #define _CHRE_SENSOR_H_
19
20 /**
21 * API dealing with sensor interaction in the Context Hub Runtime
22 * Environment.
23 *
24 * This includes the definition of our sensor types and the ability to
25 * configure them for receiving events.
26 */
27
28 #include <stdbool.h>
29 #include <stdint.h>
30
31 // For CHRE_EVENT_SENSOR_FIRST_EVENT and CHRE_EVENT_SENSOR_LAST_EVENT
32 #include <chre/event.h>
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 /**
39 * The CHRE_SENSOR_TYPE_* defines are the sensor types supported.
40 *
41 * Unless otherwise noted, each of these sensor types is based off of a
42 * corresponding sensor type in the Android API's sensors.h interface.
43 * For a given CHRE_SENSOR_TYPE_FOO, it corresponds to the SENSOR_TYPE_FOO in
44 * hardware/libhardware/include/hardware/sensors.h of the Android code base.
45 *
46 * Unless otherwise noted below, a CHRE_SENSOR_TYPE_FOO should be assumed
47 * to work the same as the Android SENSOR_TYPE_FOO, as documented in the
48 * sensors.h documentation and as detailed within the Android Compatibility
49 * Definition Document.
50 *
51 * Note that every sensor will generate CHRE_EVENT_SENSOR_SAMPLING_CHANGE
52 * events, so it is not listed with each individual sensor.
53 */
54
55 /**
56 * Accelerometer.
57 *
58 * Generates: CHRE_EVENT_SENSOR_ACCELEROMETER_DATA
59 *
60 * @see CHRE_EVENT_SENSOR_ACCELEROMETER_DATA
61 */
62 #define CHRE_SENSOR_TYPE_ACCELEROMETER UINT8_C(1)
63
64 /**
65 * Instantaneous motion detection.
66 *
67 * Generates: CHRE_EVENT_SENSOR_INSTANT_MOTION_DETECT_DATA
68 *
69 * This is a one-shot sensor.
70 *
71 * This does not have a direct analogy within sensors.h. This is similar
72 * to SENSOR_TYPE_MOTION_DETECT, but this triggers instantly upon any
73 * motion, instead of waiting for a period of continuous motion.
74 */
75 #define CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT UINT8_C(2)
76
77 /**
78 * Stationary detection.
79 *
80 * Generates: CHRE_EVENT_SENSOR_STATIONARY_DETECT_DATA
81 *
82 * This is a one-shot sensor.
83 */
84 #define CHRE_SENSOR_TYPE_STATIONARY_DETECT UINT8_C(3)
85
86 /**
87 * Gyroscope.
88 *
89 * Generates: CHRE_EVENT_SENSOR_GYROSCOPE_DATA and
90 * CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO
91 *
92 * Note that the GYROSCOPE_DATA is always the calibrated data, and not
93 * raw data.
94 */
95 #define CHRE_SENSOR_TYPE_GYROSCOPE UINT8_C(6)
96
97 /**
98 * Magnetometer.
99 *
100 * Generates: CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_DATA and
101 * CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO
102 *
103 * Note that the GEOMAGNETIC_FIELD_DATA is always the calibrated data, and not
104 * raw data.
105 */
106 #define CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD UINT8_C(8)
107
108 /**
109 * Barometric pressure sensor.
110 *
111 * Generates: CHRE_EVENT_SENSOR_PRESSURE_DATA
112 */
113 #define CHRE_SENSOR_TYPE_PRESSURE UINT8_C(10)
114
115 /**
116 * Ambient light sensor.
117 *
118 * Generates: CHRE_EVENT_SENSOR_LIGHT_DATA
119 */
120 #define CHRE_SENSOR_TYPE_LIGHT UINT8_C(12)
121
122 /**
123 * Proximity detection.
124 *
125 * Generates: CHRE_EVENT_SENSOR_PROXIMITY_DATA
126 *
127 * This is an on-change sensor.
128 */
129 #define CHRE_SENSOR_TYPE_PROXIMITY UINT8_C(13)
130
131 /**
132 * Base value for all of the data events for sensors.
133 *
134 * The value for a data event FOO is
135 * CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_FOO
136 *
137 * This allows for easy mapping, and also explains why there are gaps
138 * in our values since we don't have all possible sensor types assigned.
139 */
140 #define CHRE_EVENT_SENSOR_DATA_EVENT_BASE CHRE_EVENT_SENSOR_FIRST_EVENT
141
142 /**
143 * nanoappHandleEvent argument: struct chreSensorThreeAxisData
144 *
145 * The data can be interpreted using the 'x', 'y', and 'z' fields within
146 * 'readings', or by the 3D array 'v' (v[0] == x; v[1] == y; v[2] == z).
147 *
148 * All values are in SI units (m/s^2) and measure the acceleration of the
149 * device minus the force of gravity.
150 */
151 #define CHRE_EVENT_SENSOR_ACCELEROMETER_DATA \
152 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_ACCELEROMETER)
153
154 /**
155 * nanoappHandleEvent argument: struct chreSensorOccurrenceData
156 *
157 * Since this is a one-shot sensor, after this event is delivered to the
158 * nanoapp, the sensor automatically goes into DONE mode. Sensors of this
159 * type must be configured with a ONE_SHOT mode.
160 */
161 #define CHRE_EVENT_SENSOR_INSTANT_MOTION_DETECT_DATA \
162 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT)
163
164 /**
165 * nanoappHandleEvent argument: struct chreSensorOccurrenceData
166 *
167 * Since this is a one-shot sensor, after this event is delivered to the
168 * nanoapp, the sensor automatically goes into DONE mode. Sensors of this
169 * type must be configured with a ONE_SHOT mode.
170 */
171 #define CHRE_EVENT_SENSOR_STATIONARY_DETECT_DATA \
172 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_STATIONARY_DETECT)
173
174 /**
175 * nanoappHandleEvent argument: struct chreSensorThreeAxisData
176 *
177 * The data can be interpreted using the 'x', 'y', and 'z' fields within
178 * 'readings', or by the 3D array 'v' (v[0] == x; v[1] == y; v[2] == z).
179 *
180 * All values are in radians/second and measure the rate of rotation
181 * around the X, Y and Z axis.
182 */
183 #define CHRE_EVENT_SENSOR_GYROSCOPE_DATA \
184 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_GYROSCOPE)
185
186 /**
187 * nanoappHandleEvent argument: struct chreSensorThreeAxisData
188 *
189 * The data can be interpreted using the 'x', 'y', and 'z' fields within
190 * 'readings', or by the 3D array 'v' (v[0] == x; v[1] == y; v[2] == z).
191 *
192 * All values are in micro-Tesla (uT) and measure the geomagnetic
193 * field in the X, Y and Z axis.
194 */
195 #define CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_DATA \
196 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD)
197
198 /**
199 * nanoappHandleEvent argument: struct chreSensorFloatData
200 *
201 * The data can be interpreted using the 'pressure' field within 'readings'.
202 * This value is in hectopascals (hPa).
203 */
204 #define CHRE_EVENT_SENSOR_PRESSURE_DATA \
205 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_PRESSURE)
206
207 /**
208 * nanoappHandleEvent argument: struct chreSensorFloatData
209 *
210 * The data can be interpreted using the 'light' field within 'readings'.
211 * This value is in SI lux units.
212 */
213 #define CHRE_EVENT_SENSOR_LIGHT_DATA \
214 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_LIGHT)
215
216 /**
217 * nanoappHandleEvent argument: struct chreSensorByteData
218 *
219 * The data is interpreted from the following fields in 'readings':
220 * o 'isNear': If set to 1, we are nearby (on the order of centimeters);
221 * if set to 0, we are far.
222 * o 'invalid': If set to 1, this is not a valid reading of this data.
223 *
224 * As an on-change sensor, there is an event generated upon configuring
225 * this sensor. This is when we might get an 'invalid' reading. Thus,
226 * this field must be checked on the first event before interpreting 'isNear'.
227 */
228 #define CHRE_EVENT_SENSOR_PROXIMITY_DATA \
229 (CHRE_EVENT_SENSOR_DATA_EVENT_BASE + CHRE_SENSOR_TYPE_PROXIMITY)
230
231
232 /**
233 * First value for sensor events which are not data from the sensor.
234 *
235 * Unlike the data event values, these other event values don't have any
236 * mapping to sensor types.
237 */
238 #define CHRE_EVENT_SENSOR_OTHER_EVENTS_BASE \
239 (CHRE_EVENT_SENSOR_FIRST_EVENT + 0x0100)
240
241 /**
242 * nanoappHandleEvent argument: struct chreSensorSamplingStatusEvent
243 *
244 * Indicates that the interval and/or the latency which this sensor is
245 * sampling at has changed.
246 */
247 #define CHRE_EVENT_SENSOR_SAMPLING_CHANGE \
248 (CHRE_EVENT_SENSOR_OTHER_EVENTS_BASE + 0)
249
250 /**
251 * nanoappHandleEvent argument: struct chreSensorThreeAxisData
252 *
253 * The data can be interpreted using the 'x_bias', 'y_bias', and 'z_bias'
254 * field within 'readings', or by the 3D array 'bias' (bias[0] == x_bias;
255 * bias[1] == y_bias; bias[2] == z_bias).
256 *
257 * All values are in radians/second and measure the rate of rotation
258 * around the X, Y and Z axis.
259 */
260 #define CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO \
261 (CHRE_EVENT_SENSOR_OTHER_EVENTS_BASE + 1)
262
263 /**
264 * nanoappHandleEvent argument: struct chreSensorThreeAxisData
265 *
266 * The data can be interpreted using the 'x_bias', 'y_bias', and 'z_bias'
267 * field within 'readings', or by the 3D array 'bias' (bias[0] == x_bias;
268 * bias[1] == y_bias; bias[2] == z_bias).
269 *
270 * All values are in micro-Tesla (uT) and measure the geomagnetic
271 * field in the X, Y and Z axis.
272 */
273 #define CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO \
274 (CHRE_EVENT_SENSOR_OTHER_EVENTS_BASE + 2)
275
276
277 #if CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO > CHRE_EVENT_SENSOR_LAST_EVENT
278 #error Too many sensor events.
279 #endif
280
281
282 /**
283 * Value indicating we want the smallest possible latency for a sensor.
284 *
285 * This literally translates to 0 nanoseconds for the chreSensorConfigure()
286 * argument. While we won't get exactly 0 nanoseconds, the CHRE will
287 * queue up this event As Soon As Possible.
288 */
289 #define CHRE_SENSOR_LATENCY_ASAP UINT64_C(0)
290
291 /**
292 * Special value indicating non-importance of the interval.
293 *
294 * @see chreSensorConfigure
295 * @see chreSensorSamplingStatus
296 */
297 #define CHRE_SENSOR_INTERVAL_DEFAULT UINT64_C(-1)
298
299 /**
300 * Special value indicating non-importance of the latency.
301 *
302 * @see chreSensorConfigure
303 * @see chreSensorSamplingStatus
304 */
305 #define CHRE_SENSOR_LATENCY_DEFAULT UINT64_C(-1)
306
307
308 // This is used to define elements of enum chreSensorConfigureMode.
309 #define CHRE_SENSOR_CONFIGURE_RAW_POWER_ON (1 << 0)
310
311 // This is used to define elements of enum chreSensorConfigureMode.
312 #define CHRE_SENSOR_CONFIGURE_RAW_REPORT_CONTINUOUS (1 << 1)
313
314 // This is used to define elements of enum chreSensorConfigureMode.
315 #define CHRE_SENSOR_CONFIGURE_RAW_REPORT_ONE_SHOT (2 << 1)
316
317
318
319 /**
320 * Modes we can configure a sensor to use.
321 *
322 * Our mode will affect not only how/if we receive events, but
323 * also whether or not the sensor will be powered on our behalf.
324 *
325 * @see chreSensorConfigure
326 */
327 enum chreSensorConfigureMode {
328 /**
329 * Get events from the sensor.
330 *
331 * Power: Turn on if not already on.
332 * Reporting: Continuous. Send each new event as it comes (subject to
333 * batching and latency).
334 */
335 CHRE_SENSOR_CONFIGURE_MODE_CONTINUOUS =
336 (CHRE_SENSOR_CONFIGURE_RAW_POWER_ON |
337 CHRE_SENSOR_CONFIGURE_RAW_REPORT_CONTINUOUS),
338
339 /**
340 * Get a single event from the sensor and then become DONE.
341 *
342 * Once the event is sent, the sensor automatically
343 * changes to CHRE_SENSOR_CONFIGURE_MODE_DONE mode.
344 *
345 * Power: Turn on if not already on.
346 * Reporting: One shot. Send the next event and then be DONE.
347 */
348 CHRE_SENSOR_CONFIGURE_MODE_ONE_SHOT =
349 (CHRE_SENSOR_CONFIGURE_RAW_POWER_ON |
350 CHRE_SENSOR_CONFIGURE_RAW_REPORT_ONE_SHOT),
351
352 /**
353 * Get events from a sensor that are generated for other apps.
354 *
355 * This is considered passive because the sensor will not be powered
356 * on for the sake of our nanoapp. If and only if another app in
357 * the system has requested this sensor power on will we get events.
358 *
359 * This can be useful for something which is interested in seeing data,
360 * but not interested enough to be responsible for powering on the sensor.
361 *
362 * Power: Do not power the sensor on our behalf.
363 * Reporting: Continuous. Send each event as it comes.
364 */
365 CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_CONTINUOUS =
366 CHRE_SENSOR_CONFIGURE_RAW_REPORT_CONTINUOUS,
367
368 /**
369 * Get a single event from a sensor that is generated for other apps.
370 *
371 * See CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_CONTINUOUS for more details
372 * on what be "passive" means.
373 *
374 * Power: Do not power the sensor on our behalf.
375 * Reporting: One shot. Send only the next event and then be DONE.
376 */
377 CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_ONE_SHOT =
378 CHRE_SENSOR_CONFIGURE_RAW_REPORT_ONE_SHOT,
379
380 /**
381 * Indicate we are done using this sensor and no longer interested in it.
382 *
383 * See chreSensorConfigure for more details on expressing interest or
384 * lack of interest in a sensor.
385 *
386 * Power: Do not power the sensor on our behalf.
387 * Reporting: None.
388 */
389 CHRE_SENSOR_CONFIGURE_MODE_DONE = 0,
390 };
391
392 /**
393 * A structure containing information about a Sensor.
394 *
395 * See documentation of individual fields below.
396 */
397 struct chreSensorInfo {
398 /**
399 * The name of the sensor.
400 *
401 * A text name, useful for logging/debugging, describing the Sensor. This
402 * is not assured to be unique (i.e. there could be multiple sensors with
403 * the name "Temperature").
404 *
405 * CHRE implementations may not set this as NULL. An empty
406 * string, while discouraged, is legal.
407 */
408 const char *sensorName;
409
410 /**
411 * One of the CHRE_SENSOR_TYPE_* defines above.
412 */
413 uint8_t sensorType;
414
415 /**
416 * Flag indicating if this sensor is on-change.
417 *
418 * An on-change sensor only generates events when underlying state
419 * changes. This has the same meaning as on-change does in the Android
420 * Sensors HAL. See sensors.h for much more details.
421 *
422 * A value of 1 indicates this is on-change. 0 indicates this is not
423 * on-change.
424 */
425 uint8_t isOnChange : 1;
426
427 /**
428 * Flag indicating if this sensor is one-shot.
429 *
430 * A one-shot sensor only triggers a single event, and then automatically
431 * disables itself.
432 *
433 * A value of 1 indicates this is one-shot. 0 indicates this is not
434 * on-change.
435 */
436 uint8_t isOneShot : 1;
437 uint8_t unusedFlags : 6;
438 };
439
440 /**
441 * Header used in every structure containing batchable data from a sensor.
442 *
443 * The typical structure for sensor data looks like:
444 *
445 * struct chreSensorTypeData {
446 * struct chreSensorDataHeader header;
447 * struct chreSensorTypeSampleData {
448 * uint32_t timestampDelta;
449 * union {
450 * <type> value;
451 * <type> interpretation0;
452 * <type> interpretation1;
453 * };
454 * } readings[1];
455 * };
456 *
457 * Despite 'readings' being declared as an array of 1 element,
458 * an instance of the struct will actually have 'readings' as
459 * an array of header.readingCount elements (which may be 1).
460 * The 'timestampDelta' is in relation to the previous 'readings' (or
461 * the baseTimestamp for readings[0]. So,
462 * Timestamp for readings[0] == header.baseTimestamp +
463 * readings[0].timestampDelta.
464 * Timestamp for readings[1] == timestamp for readings[0] +
465 * readings[1].timestampDelta.
466 * And thus, in order to determine the timestamp for readings[N], it's
467 * necessary to process through all of the N-1 readings. The advantage,
468 * though, is that our entire readings can span an arbitrary length of time,
469 * just as long as any two consecutive readings differ by no more than
470 * 4.295 seconds (timestampDelta, like all time in the CHRE, is in
471 * nanoseconds).
472 *
473 * If a sensor has batched readings where two consecutive readings differ by
474 * more than 4.295 seconds, the CHRE will split them across multiple
475 * instances of the struct, and send multiple events.
476 *
477 * The value from the sensor is typically expressed in a union,
478 * allowing a generic access to the data ('value'), along with
479 * differently named access giving a more natural interpretation
480 * of the data for the specific sensor types which use this
481 * structure. This allows, for example, barometer code to
482 * reference readings[N].pressure, and an ambient light sensor
483 * to reference readings[N].light, while both use the same
484 * structure.
485 */
486 struct chreSensorDataHeader {
487 /**
488 * The base timestamp, in nanoseconds.
489 */
490 uint64_t baseTimestamp;
491
492 /**
493 * The handle of the sensor producing this event.
494 */
495 uint32_t sensorHandle;
496
497 /**
498 * The number elements in the 'readings' array.
499 *
500 * This must be at least 1.
501 */
502 uint16_t readingCount;
503
504 /**
505 * Reserved bytes.
506 *
507 * These must be 0.
508 */
509 uint8_t reserved[2];
510 };
511
512 /**
513 * Data for a sensor which reports on three axes.
514 *
515 * This is used by CHRE_EVENT_SENSOR_ACCELEROMETER_DATA,
516 * CHRE_EVENT_SENSOR_GYROSCOPE_DATA,
517 * CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO,
518 * CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_DATA, and
519 * CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO.
520 */
521 struct chreSensorThreeAxisData {
522 /**
523 * @see chreSensorDataHeader
524 */
525 struct chreSensorDataHeader header;
526 struct chreSensorThreeAxisSampleData {
527 /**
528 * @see chreSensorDataHeader
529 */
530 uint32_t timestampDelta;
531 union {
532 float values[3];
533 float v[3];
534 struct {
535 float x;
536 float y;
537 float z;
538 };
539 float bias[3];
540 struct {
541 float x_bias;
542 float y_bias;
543 float z_bias;
544 };
545 };
546 } readings[1];
547 };
548
549 /**
550 * Data from a sensor where we only care about a event occurring.
551 *
552 * This is a bit unusual in that our readings have no data in addition
553 * to the timestamp. But since we only care about the occurrence, we
554 * don't need to know anything else.
555 *
556 * Used by: CHRE_EVENT_SENSOR_INSTANT_MOTION_DETECT_DATA and
557 * CHRE_EVENT_SENSOR_STATIONARY_DETECT_DATA.
558 */
559 struct chreSensorOccurrenceData {
560 struct chreSensorDataHeader header;
561 struct chreSensorOccurrenceSampleData {
562 uint32_t timestampDelta;
563 // This space intentionally left blank.
564 // Only the timestamp is meaningful here, there
565 // is no additional data.
566 } readings[1];
567 };
568
569 /**
570 * CHRE_EVENT_SENSOR_LIGHT_DATA and CHRE_EVENT_SENSOR_PRESSURE_DATA.
571 */
572 struct chreSensorFloatData {
573 struct chreSensorDataHeader header;
574 struct chreSensorFloatSampleData {
575 uint32_t timestampDelta;
576 union {
577 float value;
578 float light; // lux
579 float pressure; // hectopascals (hPa)
580 };
581 } readings[1];
582 };
583
584 /**
585 * CHRE_EVENT_SENSOR_PROXIMITY_DATA.
586 */
587 struct chreSensorByteData {
588 struct chreSensorDataHeader header;
589 struct chreSensorByteSampleData {
590 uint32_t timestampDelta;
591 union {
592 uint8_t value;
593 struct {
594 uint8_t isNear : 1;
595 uint8_t invalid : 1;
596 uint8_t padding0 : 6;
597 };
598 };
599 } readings[1];
600 };
601
602 /**
603 * The status of a sensor's sampling configuration.
604 */
605 struct chreSensorSamplingStatus {
606 /**
607 * The interval, in nanoseconds, at which the sensor is now sampling.
608 *
609 * If this is CHRE_SENSOR_INTERVAL_DEFAULT, then a sampling interval
610 * isn't meaningful for this sensor.
611 *
612 * Note that if 'enabled' is false, this value is not meaningful.
613 */
614 uint64_t interval;
615
616 /**
617 * The latency, in nanoseconds, at which the senor is now reporting.
618 *
619 * If this is CHRE_SENSOR_LATENCY_DEFAULT, then a latency
620 * isn't meaningful for this sensor.
621 *
622 * Note that if 'enabled' is false, this value is not meaningful.
623 */
624 uint64_t latency;
625
626 /**
627 * True if the sensor is actively powered and sampling; false otherwise.
628 */
629 bool enabled;
630 };
631
632 /**
633 * The nanoappHandleEvent argument for CHRE_EVENT_SENSOR_SAMPLING_CHANGE.
634 *
635 * Note that only at least one of 'interval' or 'latency' must be
636 * different than it was prior to this event. Thus, one of these
637 * fields may be (but doesn't need to be) the same as before.
638 */
639 struct chreSensorSamplingStatusEvent {
640 /**
641 * The handle of the sensor which has experienced a change in sampling.
642 */
643 uint32_t sensorHandle;
644
645 /**
646 * The new sampling status.
647 *
648 * At least one of the field in this struct will be different from
649 * the previous sampling status event.
650 */
651 struct chreSensorSamplingStatus status;
652 };
653
654
655
656 /**
657 * Find the default sensor for a given sensor type.
658 *
659 * @param sensorType One of the CHRE_SENSOR_TYPE_* constants.
660 * @param handle If a sensor is found, then the memory will be filled with
661 * the value for the sensor's handle. This argument must be non-NULL.
662 * @returns true if a sensor was found, false otherwise.
663 */
664 bool chreSensorFindDefault(uint8_t sensorType, uint32_t *handle);
665
666 /**
667 * Get the chreSensorInfo struct for a given sensor.
668 *
669 * @param sensorHandle The sensor handle, as obtained from
670 * chreSensorFindDefault() or passed to nanoappHandleEvent().
671 * @param info If the sensor is valid, then this memory will be filled with
672 * the SensorInfo contents for this sensor. This argument must be
673 * non-NULL.
674 * @returns true if the senor handle is valid and 'info' was filled in;
675 * false otherwise.
676 */
677 bool chreGetSensorInfo(uint32_t sensorHandle, struct chreSensorInfo *info);
678
679 /**
680 * Get the chreSensorSamplingStatus struct for a given sensor.
681 *
682 * Note that this may be different from what was requested in
683 * chreSensorConfigure(), for multiple reasons. It's possible that the sensor
684 * does not exactly support the interval requested in chreSensorConfigure(), so
685 * a faster one was chosen.
686 *
687 * It's also possible that there is another user of this sensor who has
688 * requested a faster interval and/or lower latency. This latter scenario
689 * should be noted, because it means the sensor rate can change due to no
690 * interaction from this nanoapp. Note that the
691 * CHRE_EVENT_SENSOR_SAMPLING_CHANGE event will trigger in this case, so it's
692 * not necessary to poll for such a change.
693 *
694 * @param sensorHandle The sensor handle, as obtained from
695 * chreSensorFindDefault() or passed to nanoappHandleEvent().
696 * @param status If the sensor is valid, then this memory will be filled with
697 * the sampling status contents for this sensor. This argument must be
698 * non-NULL.
699 * @returns true if the senor handle is valid and 'status' was filled in;
700 * false otherwise.
701 */
702 bool chreGetSensorSamplingStatus(uint32_t sensorHandle,
703 struct chreSensorSamplingStatus *status);
704
705 /**
706 * Configures a given sensor at a specific interval and latency and mode.
707 *
708 * If this sensor's chreSensorInfo has isOneShot set to 1,
709 * then the mode must be one of the ONE_SHOT modes, or this method will fail.
710 *
711 * The CHRE wants to power as few sensors as possible, in keeping with its
712 * low power design. As such, it only turns on sensors when there are clients
713 * actively interested in that sensor data, and turns off sensors as soon as
714 * there are no clients interested in them. Calling this method generally
715 * indicates an interest, and using CHRE_SENSOR_CONFIGURE_MODE_DONE shows
716 * when we are no longer interested.
717 *
718 * Thus, each initial Configure of a sensor (per nanoapp) needs to eventually
719 * have a DONE call made, either directly or on its behalf. Subsequent calls
720 * to a Configure method within the same nanoapp, when there has been no DONE
721 * in between, still only require a single DONE call.
722 *
723 * For example, the following is valid usage:
724 * <code>
725 * chreSensorConfigure(myHandle, mode, interval0, latency0);
726 * [...]
727 * chreSensorConfigure(myHandle, mode, interval1, latency0);
728 * [...]
729 * chreSensorConfigure(myHandle, mode, interval1, latency1);
730 * [...]
731 * chreSensorConfigureModeOnly(myHandle, CHRE_SENSOR_CONFIGURE_MODE_DONE);
732 * </code>
733 *
734 * The first call to Configure is the one which creates the requirement
735 * to eventually call with DONE. The subsequent calls are just changing the
736 * interval/latency. They have not changed the fact that this nanoapp is
737 * still interested in output from the sensor 'myHandle'. Thus, only one
738 * single call for DONE is needed.
739 *
740 * There is a special case. One-shot sensors, sensors which
741 * just trigger a single event and never trigger again, implicitly go into
742 * DONE mode after that single event triggers. Thus, the
743 * following are legitimate usages:
744 * <code>
745 * chreSensorConfigure(myHandle, MODE_ONE_SHOT, rate, latency);
746 * [...]
747 * [myHandle triggers an event]
748 * [no need to configure to DONE].
749 * </code>
750 *
751 * And:
752 * <code>
753 * chreSensorConfigure(myHandle, MODE_ONE_SHOT, rate, latency);
754 * [...]
755 * chreSensorConfigureModeOnly(myHandle, MODE_DONE);
756 * [we cancelled myHandle before it ever triggered an event]
757 * </code>
758 *
759 * Note that while PASSIVE modes, by definition, don't express
760 * an interest in powering the sensor, DONE is still necessary
761 * to silence the event reporting.
762 *
763 * @param sensorHandle The handle to the sensor, as obtained from
764 * chreSensorFindDefault().
765 * @param mode The mode to use. See descriptions within the
766 * chreSensorConfigureMode enum.
767 * @param interval The interval, in nanoseconds, at which we want events from
768 * the sensor. On success, the sensor will be set to 'interval', or a value
769 * less than 'interval'. There is a special value
770 * CHRE_SENSOR_INTERVAL_DEFAULT, in which we don't express a preference for
771 * the interval, and allow the sensor to chose what it wants. Note that
772 * due to batching, we may receive events less frequently than
773 * 'interval'.
774 * @param latency The maximum latency, in nanoseconds, allowed before the
775 * CHRE begins delivery of an event. This will control how many events
776 * can be queued by the sensor before requiring a delivery event.
777 * Latency is defined as the "timestamp when event is queued by the CHRE"
778 * minus "timestamp of oldest unsent data reading".
779 * There is a special value CHRE_SENSOR_LATENCY_DEFAULT, in which we don't
780 * express a preference for the latency, and allow the sensor to chose what
781 * it wants.
782 * Note that there is no assurance of how long it will take an event to
783 * get through a CHRE's queueing system, and thus there is no ability to
784 * request a minimum time from the occurrence of a phenomenon to when the
785 * nanoapp receives the information. The current CHRE API has no
786 * real-time elements, although future versions may introduce some to
787 * help with this issue.
788 * @returns true if the configuration succeeded, false otherwise.
789 *
790 * @see chreSensorConfigureMode
791 * @see chreSensorFindDefault
792 * @see chreSensorInfo
793 */
794 bool chreSensorConfigure(uint32_t sensorHandle,
795 enum chreSensorConfigureMode mode,
796 uint64_t interval, uint64_t latency);
797
798 /**
799 * Short cut for chreSensorConfigure where we only want to configure the mode
800 * and do not care about interval/latency.
801 *
802 * @see chreSensorConfigure
803 */
chreSensorConfigureModeOnly(uint32_t sensorHandle,enum chreSensorConfigureMode mode)804 static inline bool chreSensorConfigureModeOnly(
805 uint32_t sensorHandle, enum chreSensorConfigureMode mode) {
806 return chreSensorConfigure(sensorHandle,
807 mode,
808 CHRE_SENSOR_INTERVAL_DEFAULT,
809 CHRE_SENSOR_LATENCY_DEFAULT);
810 }
811
812
813 #ifdef __cplusplus
814 }
815 #endif
816
817 #endif /* _CHRE_SENSOR_H_ */
818