12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133 |
- /*
- * File : sensors.h
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2014, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2014-08-03 Bernard the first version
- */
- /* Modified from: https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */
- /*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef SENSORS_H__
- #define SENSORS_H__
- #include <rtdevice.h>
- #include <stdint.h>
- #ifdef __CC_ARM /* skip warning in armcc */
- #pragma anon_unions
- #endif
- /**
- * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
- * A Handle identifies a given sensors. The handle is used to activate
- * and/or deactivate sensors.
- * In this version of the API there can only be 256 handles.
- */
- #define SENSORS_HANDLE_BASE 0
- #define SENSORS_HANDLE_BITS 8
- #define SENSORS_HANDLE_COUNT (1<<SENSORS_HANDLE_BITS)
- /*
- * flags for (*batch)()
- * Availability: SENSORS_DEVICE_API_VERSION_1_0
- * see (*batch)() documentation for details
- */
- enum
- {
- SENSORS_BATCH_DRY_RUN = 0x00000001,
- SENSORS_BATCH_WAKE_UPON_FIFO_FULL = 0x00000002
- };
- /*
- * what field for meta_data_event_t
- */
- enum
- {
- /* a previous flush operation has completed */
- META_DATA_FLUSH_COMPLETE = 1,
- META_DATA_VERSION /* always last, leave auto-assigned */
- };
- /**
- * Definition of the axis used by the sensor HAL API
- *
- * This API is relative to the screen of the device in its default orientation,
- * that is, if the device can be used in portrait or landscape, this API
- * is only relative to the NATURAL orientation of the screen. In other words,
- * the axis are not swapped when the device's screen orientation changes.
- * Higher level services /may/ perform this transformation.
- *
- * x<0 x>0
- * ^
- * |
- * +-----------+--> y>0
- * | |
- * | |
- * | |
- * | | / z<0
- * | | /
- * | | /
- * O-----------+/
- * |[] [ ] []/
- * +----------/+ y<0
- * /
- * /
- * |/ z>0 (toward the sky)
- *
- * O: Origin (x=0,y=0,z=0)
- *
- */
- /*
- * Interaction with suspend mode
- *
- * Unless otherwise noted, an enabled sensor shall not prevent the
- * SoC to go into suspend mode. It is the responsibility of applications
- * to keep a partial wake-lock should they wish to receive sensor
- * events while the screen is off. While in suspend mode, and unless
- * otherwise noted (batch mode, sensor particularities, ...), enabled sensors'
- * events are lost.
- *
- * Note that conceptually, the sensor itself is not de-activated while in
- * suspend mode -- it's just that the data it returns are lost. As soon as
- * the SoC gets out of suspend mode, operations resume as usual. Of course,
- * in practice sensors shall be disabled while in suspend mode to
- * save power, unless batch mode is active, in which case they must
- * continue fill their internal FIFO (see the documentation of batch() to
- * learn how suspend interacts with batch mode).
- *
- * In batch mode, and only when the flag SENSORS_BATCH_WAKE_UPON_FIFO_FULL is
- * set and supported, the specified sensor must be able to wake-up the SoC and
- * be able to buffer at least 10 seconds worth of the requested sensor events.
- *
- * There are notable exceptions to this behavior, which are sensor-dependent
- * (see sensor types definitions below)
- *
- *
- * The sensor type documentation below specifies the wake-up behavior of
- * each sensor:
- * wake-up: yes this sensor must wake-up the SoC to deliver events
- * wake-up: no this sensor shall not wake-up the SoC, events are dropped
- *
- */
- /*
- * Sensor type
- *
- * Each sensor has a type which defines what this sensor measures and how
- * measures are reported. All types are defined below.
- *
- * Device manufacturers (OEMs) can define their own sensor types, for
- * their private use by applications or services provided by them. Such
- * sensor types are specific to an OEM and can't be exposed in the SDK.
- * These types must start at SENSOR_TYPE_DEVICE_PRIVATE_BASE.
- */
- /*
- * Base for device manufacturers private sensor types.
- * These sensor types can't be exposed in the SDK.
- */
- #define SENSOR_TYPE_DEVICE_PRIVATE_BASE 0x10000
- /*
- * Sensor fusion and virtual sensors
- *
- * Many sensor types are or can be implemented as virtual sensors from
- * physical sensors on the device. For instance the rotation vector sensor,
- * orientation sensor, step-detector, step-counter, etc...
- *
- * From the point of view of this API these virtual sensors MUST appear as
- * real, individual sensors. It is the responsibility of the driver and HAL
- * to make sure this is the case.
- *
- * In particular, all sensors must be able to function concurrently.
- * For example, if defining both an accelerometer and a step counter,
- * then both must be able to work concurrently.
- */
- /*
- * Trigger modes
- *
- * Sensors can report events in different ways called trigger modes,
- * each sensor type has one and only one trigger mode associated to it.
- * Currently there are four trigger modes defined:
- *
- * continuous: events are reported at a constant rate defined by setDelay().
- * eg: accelerometers, gyroscopes.
- * on-change: events are reported only if the sensor's value has changed.
- * setDelay() is used to set a lower limit to the reporting
- * period (minimum time between two events).
- * The HAL must return an event immediately when an on-change
- * sensor is activated.
- * eg: proximity, light sensors
- * one-shot: upon detection of an event, the sensor deactivates itself and
- * then sends a single event. Order matters to avoid race
- * conditions. No other event is sent until the sensor get
- * reactivated. setDelay() is ignored.
- * eg: significant motion sensor
- * special: see details in the sensor type specification below
- *
- */
- /*
- * SENSOR_TYPE_META_DATA
- * trigger-mode: n/a
- * wake-up sensor: n/a
- *
- * NO SENSOR OF THAT TYPE MUST BE RETURNED (*get_sensors_list)()
- *
- * SENSOR_TYPE_META_DATA is a special token used to populate the
- * sensors_meta_data_event structure. It doesn't correspond to a physical
- * sensor. sensors_meta_data_event are special, they exist only inside
- * the HAL and are generated spontaneously, as opposed to be related to
- * a physical sensor.
- *
- * sensors_meta_data_event_t.version must be META_DATA_VERSION
- * sensors_meta_data_event_t.sensor must be 0
- * sensors_meta_data_event_t.type must be SENSOR_TYPE_META_DATA
- * sensors_meta_data_event_t.reserved must be 0
- * sensors_meta_data_event_t.timestamp must be 0
- *
- * The payload is a meta_data_event_t, where:
- * meta_data_event_t.what can take the following values:
- *
- * META_DATA_FLUSH_COMPLETE
- * This event indicates that a previous (*flush)() call has completed for the sensor
- * handle specified in meta_data_event_t.sensor.
- * see (*flush)() for more details
- *
- * All other values for meta_data_event_t.what are reserved and
- * must not be used.
- *
- */
- #define SENSOR_TYPE_META_DATA (0)
- /*
- * SENSOR_TYPE_ACCELEROMETER
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * All values are in SI units (m/s^2) and measure the acceleration of the
- * device minus the force of gravity.
- *
- * Acceleration sensors return sensor events for all 3 axes at a constant
- * rate defined by setDelay().
- *
- * x: Acceleration on the x-axis
- * y: Acceleration on the y-axis
- * z: Acceleration on the z-axis
- *
- * Note that the readings from the accelerometer include the acceleration
- * due to gravity (which is opposite to the direction of the gravity vector).
- *
- * Examples:
- * The norm of <x, y, z> should be close to 0 when in free fall.
- *
- * When the device lies flat on a table and is pushed on its left side
- * toward the right, the x acceleration value is positive.
- *
- * When the device lies flat on a table, the acceleration value is +9.81,
- * which correspond to the acceleration of the device (0 m/s^2) minus the
- * force of gravity (-9.81 m/s^2).
- *
- * When the device lies flat on a table and is pushed toward the sky, the
- * acceleration value is greater than +9.81, which correspond to the
- * acceleration of the device (+A m/s^2) minus the force of
- * gravity (-9.81 m/s^2).
- */
- #define SENSOR_TYPE_ACCELEROMETER (1)
- /*
- * SENSOR_TYPE_GEOMAGNETIC_FIELD
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * All values are in micro-Tesla (uT) and measure the geomagnetic
- * field in the X, Y and Z axis.
- *
- * Returned values include calibration mechanisms such that the vector is
- * aligned with the magnetic declination and heading of the earth's
- * geomagnetic field.
- *
- * Magnetic Field sensors return sensor events for all 3 axes at a constant
- * rate defined by setDelay().
- */
- #define SENSOR_TYPE_GEOMAGNETIC_FIELD (2)
- #define SENSOR_TYPE_MAGNETIC_FIELD SENSOR_TYPE_GEOMAGNETIC_FIELD
- /*
- * SENSOR_TYPE_ORIENTATION
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * All values are angles in degrees.
- *
- * Orientation sensors return sensor events for all 3 axes at a constant
- * rate defined by setDelay().
- *
- * azimuth: angle between the magnetic north direction and the Y axis, around
- * the Z axis (0<=azimuth<360).
- * 0=North, 90=East, 180=South, 270=West
- *
- * pitch: Rotation around X axis (-180<=pitch<=180), with positive values when
- * the z-axis moves toward the y-axis.
- *
- * roll: Rotation around Y axis (-90<=roll<=90), with positive values when
- * the x-axis moves towards the z-axis.
- *
- * Note: For historical reasons the roll angle is positive in the clockwise
- * direction (mathematically speaking, it should be positive in the
- * counter-clockwise direction):
- *
- * Z
- * ^
- * (+roll) .--> |
- * / |
- * | | roll: rotation around Y axis
- * X <-------(.)
- * Y
- * note that +Y == -roll
- *
- *
- *
- * Note: This definition is different from yaw, pitch and roll used in aviation
- * where the X axis is along the long side of the plane (tail to nose).
- */
- #define SENSOR_TYPE_ORIENTATION (3)
- /*
- * SENSOR_TYPE_GYROSCOPE
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * All values are in radians/second and measure the rate of rotation
- * around the X, Y and Z axis. The coordinate system is the same as is
- * used for the acceleration sensor. Rotation is positive in the
- * counter-clockwise direction (right-hand rule). That is, an observer
- * looking from some positive location on the x, y or z axis at a device
- * positioned on the origin would report positive rotation if the device
- * appeared to be rotating counter clockwise. Note that this is the
- * standard mathematical definition of positive rotation and does not agree
- * with the definition of roll given earlier.
- * The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
- *
- * automatic gyro-drift compensation is allowed but not required.
- */
- #define SENSOR_TYPE_GYROSCOPE (4)
- /*
- * SENSOR_TYPE_LIGHT
- * trigger-mode: on-change
- * wake-up sensor: no
- *
- * The light sensor value is returned in SI lux units.
- */
- #define SENSOR_TYPE_LIGHT (5)
- /*
- * SENSOR_TYPE_PRESSURE
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * The pressure sensor return the athmospheric pressure in hectopascal (hPa)
- */
- #define SENSOR_TYPE_PRESSURE (6)
- /* SENSOR_TYPE_TEMPERATURE is deprecated in the HAL */
- #define SENSOR_TYPE_TEMPERATURE (7)
- /*
- * SENSOR_TYPE_PROXIMITY
- * trigger-mode: on-change
- * wake-up sensor: yes
- *
- * The distance value is measured in centimeters. Note that some proximity
- * sensors only support a binary "close" or "far" measurement. In this case,
- * the sensor should report its maxRange value in the "far" state and a value
- * less than maxRange in the "near" state.
- */
- #define SENSOR_TYPE_PROXIMITY (8)
- /*
- * SENSOR_TYPE_GRAVITY
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * A gravity output indicates the direction of and magnitude of gravity in
- * the devices's coordinates. On Earth, the magnitude is 9.8 m/s^2.
- * Units are m/s^2. The coordinate system is the same as is used for the
- * acceleration sensor. When the device is at rest, the output of the
- * gravity sensor should be identical to that of the accelerometer.
- */
- #define SENSOR_TYPE_GRAVITY (9)
- /*
- * SENSOR_TYPE_LINEAR_ACCELERATION
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * Indicates the linear acceleration of the device in device coordinates,
- * not including gravity.
- *
- * The output is conceptually:
- * output of TYPE_ACCELERATION - output of TYPE_GRAVITY
- *
- * Readings on all axes should be close to 0 when device lies on a table.
- * Units are m/s^2.
- * The coordinate system is the same as is used for the acceleration sensor.
- */
- #define SENSOR_TYPE_LINEAR_ACCELERATION (10)
- /*
- * SENSOR_TYPE_ROTATION_VECTOR
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * The rotation vector symbolizes the orientation of the device relative to the
- * East-North-Up coordinates frame. It is usually obtained by integration of
- * accelerometer, gyroscope and magnetometer readings.
- *
- * The East-North-Up coordinate system is defined as a direct orthonormal basis
- * where:
- * - X points east and is tangential to the ground.
- * - Y points north and is tangential to the ground.
- * - Z points towards the sky and is perpendicular to the ground.
- *
- * The orientation of the phone is represented by the rotation necessary to
- * align the East-North-Up coordinates with the phone's coordinates. That is,
- * applying the rotation to the world frame (X,Y,Z) would align them with the
- * phone coordinates (x,y,z).
- *
- * The rotation can be seen as rotating the phone by an angle theta around
- * an axis rot_axis to go from the reference (East-North-Up aligned) device
- * orientation to the current device orientation.
- *
- * The rotation is encoded as the 4 (reordered) components of a unit quaternion:
- * sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
- * sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
- * sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
- * sensors_event_t.data[3] = cos(theta/2)
- * where
- * - rot_axis.x,y,z are the North-East-Up coordinates of a unit length vector
- * representing the rotation axis
- * - theta is the rotation angle
- *
- * The quaternion must be of norm 1 (it is a unit quaternion). Failure to ensure
- * this will cause erratic client behaviour.
- *
- * In addition, this sensor reports an estimated heading accuracy.
- * sensors_event_t.data[4] = estimated_accuracy (in radians)
- * The heading error must be less than estimated_accuracy 95% of the time
- *
- * This sensor must use a gyroscope and an accelerometer as main orientation
- * change input.
- *
- * This sensor can also include magnetometer input to make up for gyro drift,
- * but it cannot be implemented using only a magnetometer.
- */
- #define SENSOR_TYPE_ROTATION_VECTOR (11)
- /*
- * SENSOR_TYPE_RELATIVE_HUMIDITY
- * trigger-mode: on-change
- * wake-up sensor: no
- *
- * A relative humidity sensor measures relative ambient air humidity and
- * returns a value in percent.
- */
- #define SENSOR_TYPE_RELATIVE_HUMIDITY (12)
- /*
- * SENSOR_TYPE_AMBIENT_TEMPERATURE
- * trigger-mode: on-change
- * wake-up sensor: no
- *
- * The ambient (room) temperature in degree Celsius.
- */
- #define SENSOR_TYPE_AMBIENT_TEMPERATURE (13)
- /*
- * SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * Similar to SENSOR_TYPE_MAGNETIC_FIELD, but the hard iron calibration is
- * reported separately instead of being included in the measurement.
- * Factory calibration and temperature compensation should still be applied to
- * the "uncalibrated" measurement.
- * Separating away the hard iron calibration estimation allows the system to
- * better recover from bad hard iron estimation.
- *
- * All values are in micro-Tesla (uT) and measure the ambient magnetic
- * field in the X, Y and Z axis. Assumptions that the the magnetic field
- * is due to the Earth's poles should be avoided.
- *
- * The uncalibrated_magnetic event contains
- * - 3 fields for uncalibrated measurement: x_uncalib, y_uncalib, z_uncalib.
- * Each is a component of the measured magnetic field, with soft iron
- * and temperature compensation applied, but not hard iron calibration.
- * These values should be continuous (no re-calibration should cause a jump).
- * - 3 fields for hard iron bias estimates: x_bias, y_bias, z_bias.
- * Each field is a component of the estimated hard iron calibration.
- * They represent the offsets to apply to the calibrated readings to obtain
- * uncalibrated readings (x_uncalib ~= x_calibrated + x_bias)
- * These values are expected to jump as soon as the estimate of the hard iron
- * changes, and they should be stable the rest of the time.
- *
- * If this sensor is present, then the corresponding
- * SENSOR_TYPE_MAGNETIC_FIELD must be present and both must return the
- * same sensor_t::name and sensor_t::vendor.
- *
- * Minimum filtering should be applied to this sensor. In particular, low pass
- * filters should be avoided.
- *
- * See SENSOR_TYPE_MAGNETIC_FIELD for more information
- */
- #define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED (14)
- /*
- * SENSOR_TYPE_GAME_ROTATION_VECTOR
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * Similar to SENSOR_TYPE_ROTATION_VECTOR, but not using the geomagnetic
- * field. Therefore the Y axis doesn't point north, but instead to some other
- * reference. That reference is allowed to drift by the same order of
- * magnitude than the gyroscope drift around the Z axis.
- *
- * This sensor does not report an estimated heading accuracy:
- * sensors_event_t.data[4] is reserved and should be set to 0
- *
- * In the ideal case, a phone rotated and returning to the same real-world
- * orientation should report the same game rotation vector
- * (without using the earth's geomagnetic field).
- *
- * This sensor must be based on a gyroscope. It cannot be implemented using
- * a magnetometer.
- *
- * see SENSOR_TYPE_ROTATION_VECTOR for more details
- */
- #define SENSOR_TYPE_GAME_ROTATION_VECTOR (15)
- /*
- * SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * All values are in radians/second and measure the rate of rotation
- * around the X, Y and Z axis. An estimation of the drift on each axis is
- * reported as well.
- *
- * No gyro-drift compensation shall be performed.
- * Factory calibration and temperature compensation should still be applied
- * to the rate of rotation (angular speeds).
- *
- * The coordinate system is the same as is
- * used for the acceleration sensor. Rotation is positive in the
- * counter-clockwise direction (right-hand rule). That is, an observer
- * looking from some positive location on the x, y or z axis at a device
- * positioned on the origin would report positive rotation if the device
- * appeared to be rotating counter clockwise. Note that this is the
- * standard mathematical definition of positive rotation and does not agree
- * with the definition of roll given earlier.
- * The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
- *
- * Content of an uncalibrated_gyro event: (units are rad/sec)
- * x_uncalib : angular speed (w/o drift compensation) around the X axis
- * y_uncalib : angular speed (w/o drift compensation) around the Y axis
- * z_uncalib : angular speed (w/o drift compensation) around the Z axis
- * x_bias : estimated drift around X axis in rad/s
- * y_bias : estimated drift around Y axis in rad/s
- * z_bias : estimated drift around Z axis in rad/s
- *
- * IMPLEMENTATION NOTES:
- *
- * If the implementation is not able to estimate the drift, then this
- * sensor MUST NOT be reported by this HAL. Instead, the regular
- * SENSOR_TYPE_GYROSCOPE is used without drift compensation.
- *
- * If this sensor is present, then the corresponding
- * SENSOR_TYPE_GYROSCOPE must be present and both must return the
- * same sensor_t::name and sensor_t::vendor.
- */
- #define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED (16)
- /*
- * SENSOR_TYPE_SIGNIFICANT_MOTION
- * trigger-mode: one-shot
- * wake-up sensor: yes
- *
- * A sensor of this type triggers an event each time significant motion
- * is detected and automatically disables itself.
- * The only allowed value to return is 1.0.
- *
- * A significant motion is a motion that might lead to a change in the user
- * location.
- * Examples of such motions are:
- * walking, biking, sitting in a moving car, coach or train.
- * Examples of situations that should not trigger significant motion:
- * - phone in pocket and person is not moving
- * - phone is on a table, even if the table shakes a bit due to nearby traffic
- * or washing machine
- *
- * A note on false positive / false negative / power consumption tradeoff
- * - The goal of this sensor is to save power.
- * - Triggering an event when the user is not moving (false positive) is costly
- * in terms of power, so it should be avoided.
- * - Not triggering an event when the user is moving (false negative) is
- * acceptable as long as it is not done repeatedly. If the user has been
- * walking for 10 seconds, not triggering an event within those 10 seconds
- * is not acceptable.
- *
- * IMPORTANT NOTE: this sensor type is very different from other types
- * in that it must work when the screen is off without the need of
- * holding a partial wake-lock and MUST allow the SoC to go into suspend.
- * When significant motion is detected, the sensor must awaken the SoC and
- * the event be reported.
- *
- * If a particular hardware cannot support this mode of operation then this
- * sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
- * to "emulate" this sensor in the HAL.
- *
- * The whole point of this sensor type is to save power by keeping the
- * SoC in suspend mode when the device is at rest.
- *
- * When the sensor is not activated, it must also be deactivated in the
- * hardware: it must not wake up the SoC anymore, even in case of
- * significant motion.
- *
- * setDelay() has no effect and is ignored.
- * Once a "significant motion" event is returned, a sensor of this type
- * must disables itself automatically, as if activate(..., 0) had been called.
- */
- #define SENSOR_TYPE_SIGNIFICANT_MOTION (17)
- /*
- * SENSOR_TYPE_STEP_DETECTOR
- * trigger-mode: special
- * wake-up sensor: no
- *
- * A sensor of this type triggers an event each time a step is taken
- * by the user. The only allowed value to return is 1.0 and an event is
- * generated for each step. Like with any other event, the timestamp
- * indicates when the event (here the step) occurred, this corresponds to when
- * the foot hit the ground, generating a high variation in acceleration.
- *
- * While this sensor operates, it shall not disrupt any other sensors, in
- * particular, but not limited to, the accelerometer; which might very well
- * be in use as well.
- *
- * This sensor must be low power. That is, if the step detection cannot be
- * done in hardware, this sensor should not be defined. Also, when the
- * step detector is activated and the accelerometer is not, only steps should
- * trigger interrupts (not accelerometer data).
- *
- * setDelay() has no impact on this sensor type
- */
- #define SENSOR_TYPE_STEP_DETECTOR (18)
- /*
- * SENSOR_TYPE_STEP_COUNTER
- * trigger-mode: on-change
- * wake-up sensor: no
- *
- * A sensor of this type returns the number of steps taken by the user since
- * the last reboot while activated. The value is returned as a uint64_t and is
- * reset to zero only on a system / android reboot.
- *
- * The timestamp of the event is set to the time when the first step
- * for that event was taken.
- * See SENSOR_TYPE_STEP_DETECTOR for the signification of the time of a step.
- *
- * The minimum size of the hardware's internal counter shall be 16 bits
- * (this restriction is here to avoid too frequent wake-ups when the
- * delay is very large).
- *
- * IMPORTANT NOTE: this sensor type is different from other types
- * in that it must work when the screen is off without the need of
- * holding a partial wake-lock and MUST allow the SoC to go into suspend.
- * Unlike other sensors, while in suspend mode this sensor must stay active,
- * no events are reported during that time but, steps continue to be
- * accounted for; an event will be reported as soon as the SoC resumes if
- * the timeout has expired.
- *
- * In other words, when the screen is off and the device allowed to
- * go into suspend mode, we don't want to be woken up, regardless of the
- * setDelay() value, but the steps shall continue to be counted.
- *
- * The driver must however ensure that the internal step count never
- * overflows. It is allowed in this situation to wake the SoC up so the
- * driver can do the counter maintenance.
- *
- * While this sensor operates, it shall not disrupt any other sensors, in
- * particular, but not limited to, the accelerometer; which might very well
- * be in use as well.
- *
- * If a particular hardware cannot support these modes of operation then this
- * sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
- * to "emulate" this sensor in the HAL.
- *
- * This sensor must be low power. That is, if the step detection cannot be
- * done in hardware, this sensor should not be defined. Also, when the
- * step counter is activated and the accelerometer is not, only steps should
- * trigger interrupts (not accelerometer data).
- *
- * The whole point of this sensor type is to save power by keeping the
- * SoC in suspend mode when the device is at rest.
- */
- #define SENSOR_TYPE_STEP_COUNTER (19)
- /*
- * SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR
- * trigger-mode: continuous
- * wake-up sensor: no
- *
- * Similar to SENSOR_TYPE_ROTATION_VECTOR, but using a magnetometer instead
- * of using a gyroscope.
- *
- * This sensor must be based on a magnetometer. It cannot be implemented using
- * a gyroscope, and gyroscope input cannot be used by this sensor, as the
- * goal of this sensor is to be low power.
- * The accelerometer can be (and usually is) used.
- *
- * Just like SENSOR_TYPE_ROTATION_VECTOR, this sensor reports an estimated
- * heading accuracy:
- * sensors_event_t.data[4] = estimated_accuracy (in radians)
- * The heading error must be less than estimated_accuracy 95% of the time
- *
- * see SENSOR_TYPE_ROTATION_VECTOR for more details
- */
- #define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR (20)
- /**
- * Values returned by the accelerometer in various locations in the universe.
- * all values are in SI units (m/s^2)
- */
- #define SENSORS_GRAVITY_SUN (275.0f)
- #define SENSORS_GRAVITY_MOON (1.6f)
- #define SENSORS_GRAVITY_EARTH (9.80665f)
- #define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH)
- /** Maximum magnetic field on Earth's surface */
- #define MAGNETIC_FIELD_EARTH_MAX (60.0f)
- /** Minimum magnetic field on Earth's surface */
- #define MAGNETIC_FIELD_EARTH_MIN (30.0f)
- /** Average sea level pressure is 1013.25 hPa */
- #define SENSORS_PRESSURE_SEALEVELHPA (1013.25F)
- /** Degrees/s to rad/s multiplier */
- #define SENSORS_DPS_TO_RADS (0.017453293F)
- /** Gauss to micro-Tesla multiplier */
- #define SENSORS_GAUSS_TO_MICROTESLA (100)
- /**
- * status of orientation sensor
- */
- #define SENSOR_STATUS_UNRELIABLE 0
- #define SENSOR_STATUS_ACCURACY_LOW 1
- #define SENSOR_STATUS_ACCURACY_MEDIUM 2
- #define SENSOR_STATUS_ACCURACY_HIGH 3
- /**
- * sensor event data
- */
- typedef struct
- {
- union
- {
- float v[3];
- struct
- {
- float x;
- float y;
- float z;
- };
- struct
- {
- float azimuth;
- float pitch;
- float roll;
- };
- };
- int8_t status;
- uint8_t reserved[3];
- } sensors_vec_t;
- /**
- * sensor raw vector data
- */
- typedef struct
- {
- struct
- {
- int16_t x;
- int16_t y;
- int16_t z;
- };
- int8_t status;
- uint8_t reserved[1];
- } sensors_raw_vec_t;
- /**
- * uncalibrated gyroscope and magnetometer event data
- */
- typedef struct
- {
- union
- {
- float uncalib[3];
- struct
- {
- float x_uncalib;
- float y_uncalib;
- float z_uncalib;
- };
- };
- union
- {
- float bias[3];
- struct
- {
- float x_bias;
- float y_bias;
- float z_bias;
- };
- };
- } uncalibrated_event_t;
- typedef struct meta_data_event
- {
- int32_t what;
- int32_t sensor;
- } meta_data_event_t;
- /**
- * Union of the various types of sensor data
- * that can be returned.
- */
- typedef struct sensors_event_t
- {
- /* must be sizeof(struct sensors_event_t) */
- int32_t version;
- /* sensor identifier */
- int32_t sensor;
- /* sensor type */
- int32_t type;
- /* reserved */
- int32_t reserved0;
- /* time is in nanosecond */
- int64_t timestamp;
- union
- {
- union
- {
- float data[16];
- /* acceleration values are in meter per second per second (m/s^2) */
- sensors_vec_t acceleration;
- /* raw acceleration data */
- sensors_raw_vec_t raw_acceleration;
- /* magnetic vector values are in micro-Tesla (uT) */
- sensors_vec_t magnetic;
- /* raw magnetic data */
- sensors_raw_vec_t raw_magnetic;
- /* orientation values are in degrees */
- sensors_vec_t orientation;
- /* gyroscope values are in rad/s */
- sensors_vec_t gyro;
- /* raw gyroscope data */
- sensors_raw_vec_t raw_gyro;
- /* temperature is in degrees centigrade (Celsius) */
- float temperature;
- /* distance in centimeters */
- float distance;
- /* light in SI lux units */
- float light;
- /* pressure in hectopascal (hPa) */
- float pressure;
- /* relative humidity in percent */
- float relative_humidity;
- /* uncalibrated gyroscope values are in rad/s */
- uncalibrated_event_t uncalibrated_gyro;
- /* uncalibrated magnetometer values are in micro-Teslas */
- uncalibrated_event_t uncalibrated_magnetic;
- /* this is a special event. see SENSOR_TYPE_META_DATA above.
- * sensors_meta_data_event_t events are all reported with a type of
- * SENSOR_TYPE_META_DATA. The handle is ignored and must be zero.
- */
- meta_data_event_t meta_data;
- };
- union
- {
- uint64_t data[8];
- /* step-counter */
- uint64_t step_counter;
- } u64;
- };
- uint32_t reserved1[4];
- } sensors_event_t;
- /* see SENSOR_TYPE_META_DATA */
- typedef sensors_event_t sensors_meta_data_event_t;
- typedef struct sensor_t
- {
- /* Name of this sensor.
- * All sensors of the same "type" must have a different "name".
- */
- const char *name;
- /* vendor of the hardware part */
- const char *vendor;
- /* version of the hardware part + driver. The value of this field
- * must increase when the driver is updated in a way that changes the
- * output of this sensor. This is important for fused sensors when the
- * fusion algorithm is updated.
- */
- int version;
- /* handle that identifies this sensors. This handle is used to reference
- * this sensor throughout the HAL API.
- */
- int handle;
- /* this sensor's type. */
- int type;
- /* maximum range of this sensor's value in SI units */
- float maxRange;
- /* smallest difference between two values reported by this sensor */
- float resolution;
- /* rough estimate of this sensor's power consumption in mA */
- float power;
- /* this value depends on the trigger mode:
- *
- * continuous: minimum sample period allowed in microseconds
- * on-change : 0
- * one-shot :-1
- * special : 0, unless otherwise noted
- */
- int32_t minDelay;
- /* number of events reserved for this sensor in the batch mode FIFO.
- * If there is a dedicated FIFO for this sensor, then this is the
- * size of this FIFO. If the FIFO is shared with other sensors,
- * this is the size reserved for that sensor and it can be zero.
- */
- uint32_t fifoReservedEventCount;
- /* maximum number of events of this sensor that could be batched.
- * This is especially relevant when the FIFO is shared between
- * several sensors; this value is then set to the size of that FIFO.
- */
- uint32_t fifoMaxEventCount;
- /* reserved fields, must be zero */
- void *reserved[6];
- } sensor_t;
- enum SensorMode
- {
- SENSOR_MODE_RAW,
- SENSOR_MODE_CALIBRATED,
- SENSOR_MODE_NORMAL,
- };
- enum SensorAccelRange
- {
- SENSOR_ACCEL_RANGE_2G,
- SENSOR_ACCEL_RANGE_4G,
- SENSOR_ACCEL_RANGE_8G,
- SENSOR_ACCEL_RANGE_16G,
- };
- #define SENSOR_ACCEL_SENSITIVITY_2G ((float)2/32768)
- #define SENSOR_ACCEL_SENSITIVITY_4G ((float)4/32768)
- #define SENSOR_ACCEL_SENSITIVITY_8G ((float)8/32768)
- #define SENSOR_ACCEL_SENSITIVITY_16G ((float)16/32768)
- enum SensorGyroRange
- {
- SENSOR_GYRO_RANGE_250DPS,
- SENSOR_GYRO_RANGE_500DPS,
- SENSOR_GYRO_RANGE_1000DPS,
- SENSOR_GYRO_RANGE_2000DPS,
- };
- #define SENSOR_GYRO_SENSITIVITY_250DPS (0.00875F)
- #define SENSOR_GYRO_SENSITIVITY_500DPS (0.0175F)
- #define SENSOR_GYRO_SENSITIVITY_1000DPS (0.035F)
- #define SENSOR_GYRO_SENSITIVITY_2000DPS (0.070F)
- enum SensorDataRate
- {
- SENSOR_DATARATE_3200HZ,
- SENSOR_DATARATE_1600HZ,
- SENSOR_DATARATE_800HZ,
- SENSOR_DATARATE_400HZ,
- SENSOR_DATARATE_200HZ,
- SENSOR_DATARATE_100HZ,
- SENSOR_DATARATE_50HZ,
- SENSOR_DATARATE_25HZ,
- SENSOR_DATARATE_12_5HZ,
- SENSOR_DATARATE_6_25HZ,
- SENSOR_DATARATE_3_13HZ,
- SENSOR_DATARATE_1_56HZ,
- SENSOR_DATARATE_0_78HZ,
- SENSOR_DATARATE_0_39HZ,
- SENSOR_DATARATE_0_20HZ,
- SENSOR_DATARATE_0_10HZ,
- };
- /**
- * Sensor Configuration
- */
- typedef struct SensorConfig
- {
- int mode;
- enum SensorDataRate data_rate;
- union range
- {
- int range;
- enum SensorAccelRange accel_range;
- enum SensorGyroRange gyro_range;
- } range;
- }SensorConfig;
- typedef void (*SensorEventHandler_t)(void *user_data);
- #ifdef __cplusplus
- class SensorBase;
- class SensorManager;
- /**
- * Sensor Base Class
- */
- class SensorBase
- {
- private:
- int type;
- public:
- SensorBase(int type);
- ~SensorBase();
- virtual int configure(SensorConfig *config) = 0;
- virtual int activate(int enable) = 0;
- virtual int poll(sensors_event_t *events) = 0;
- virtual void getSensor(struct sensor_t *sensor) = 0;
- int getType(void);
- int setConfig(SensorConfig *config);
- int getConfig(SensorConfig *config);
- int subscribe(SensorEventHandler_t handler, void *user_data);
- int publish(void);
- protected:
- SensorBase *next;
- SensorBase *prev;
- /* sensor configuration */
- SensorConfig config;
- SensorEventHandler_t evtHandler;
- void *userData;
- friend class SensorManager;
- };
- /**
- * Sensor Manager
- */
- class SensorManager
- {
- public:
- SensorManager();
- ~SensorManager();
- static int registerSensor(SensorBase *sensor);
- static int unregisterSensor(SensorBase *sensor);
- static SensorBase *getDefaultSensor(int type);
- static int subscribe(int type, SensorEventHandler_t handler, void *user_data);
- static int sensorEventReady(SensorBase *sensor);
- static int pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration);
- };
- #endif
- /* C programming language APIs */
- /* rt_sensor_t is a C typedef for SensorBase */
- typedef void* rt_sensor_t;
- #ifdef __cplusplus
- extern "C" {
- #endif
- rt_sensor_t rt_sensor_get_default(int type);
- int rt_sensor_subscribe(rt_sensor_t sensor, SensorEventHandler_t handler, void *user_data);
- int rt_sensor_activate (rt_sensor_t sensor, int enable);
- int rt_sensor_configure(rt_sensor_t sensor, SensorConfig *config);
- int rt_sensor_poll(rt_sensor_t sensor, sensors_event_t *event);
- #ifdef __cplusplus
- }
- #endif
- #endif
|