blob: c3e9cb71ec1fcd82efbd1f0ce141afab536ccadc [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 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
18package android.hardware;
19
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -070020import android.os.Build;
21
Mathias Agopian74cde2c2010-06-16 18:55:46 -070022/**
23 * Class representing a sensor. Use {@link SensorManager#getSensorList} to get
24 * the list of available Sensors.
Mathias Agopian0f791a72010-06-22 21:55:01 -070025 *
26 * @see SensorManager
27 * @see SensorEventListener
28 * @see SensorEvent
29 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030 */
Jeff Brown6a2ef122012-08-10 18:19:10 -070031public final class Sensor {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032
Mathias Agopian74cde2c2010-06-16 18:55:46 -070033 /**
Scott Main92053f82013-06-13 16:32:50 -070034 * A constant describing an accelerometer sensor type.
35 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
36 * for more details.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080037 */
Mathias Agopian74cde2c2010-06-16 18:55:46 -070038 public static final int TYPE_ACCELEROMETER = 1;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039
Mathias Agopian74cde2c2010-06-16 18:55:46 -070040 /**
Scott Main92053f82013-06-13 16:32:50 -070041 * A constant describing a magnetic field sensor type.
42 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
43 * for more details.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044 */
45 public static final int TYPE_MAGNETIC_FIELD = 2;
Mathias Agopian74cde2c2010-06-16 18:55:46 -070046
47 /**
Scott Main92053f82013-06-13 16:32:50 -070048 * A constant describing an orientation sensor type.
49 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
50 * for more details.
Mathias Agopian74cde2c2010-06-16 18:55:46 -070051 *
Mathias Agopian61a44932010-02-26 18:06:26 -080052 * @deprecated use {@link android.hardware.SensorManager#getOrientation
Mathias Agopian74cde2c2010-06-16 18:55:46 -070053 * SensorManager.getOrientation()} instead.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054 */
Mathias Agopian61a44932010-02-26 18:06:26 -080055 @Deprecated
Mathias Agopian74cde2c2010-06-16 18:55:46 -070056 public static final int TYPE_ORIENTATION = 3;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080057
Scott Main92053f82013-06-13 16:32:50 -070058 /** A constant describing a gyroscope sensor type.
59 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
60 * for more details. */
Mathias Agopian74cde2c2010-06-16 18:55:46 -070061 public static final int TYPE_GYROSCOPE = 4;
62
Mike Lockwood4115c512009-11-03 10:35:43 -050063 /**
Scott Main92053f82013-06-13 16:32:50 -070064 * A constant describing a light sensor type.
65 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
66 * for more details.
Mike Lockwood4115c512009-11-03 10:35:43 -050067 */
Mathias Agopian74cde2c2010-06-16 18:55:46 -070068 public static final int TYPE_LIGHT = 5;
Mathias Agopian210fc912010-02-26 13:51:39 -080069
Scott Main92053f82013-06-13 16:32:50 -070070 /** A constant describing a pressure sensor type.
71 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
72 * for more details. */
Mathias Agopian74cde2c2010-06-16 18:55:46 -070073 public static final int TYPE_PRESSURE = 6;
Mathias Agopian210fc912010-02-26 13:51:39 -080074
Mathias Agopian462db222011-03-22 18:44:26 -070075 /**
76 * A constant describing a temperature sensor type
77 *
78 * @deprecated use
79 * {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE
80 * Sensor.TYPE_AMBIENT_TEMPERATURE} instead.
81 */
82 @Deprecated
Mathias Agopian74cde2c2010-06-16 18:55:46 -070083 public static final int TYPE_TEMPERATURE = 7;
Mathias Agopian210fc912010-02-26 13:51:39 -080084
Mike Lockwood4115c512009-11-03 10:35:43 -050085 /**
Scott Main92053f82013-06-13 16:32:50 -070086 * A constant describing a proximity sensor type.
87 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
88 * for more details.
Mike Lockwood4115c512009-11-03 10:35:43 -050089 */
Mathias Agopian74cde2c2010-06-16 18:55:46 -070090 public static final int TYPE_PROXIMITY = 8;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091
Mathias Agopian74cde2c2010-06-16 18:55:46 -070092 /**
Kevin Powellf35fd952010-07-19 19:10:40 -070093 * A constant describing a gravity sensor type.
Scott Main92053f82013-06-13 16:32:50 -070094 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
Kevin Powellf35fd952010-07-19 19:10:40 -070095 * for more details.
96 */
97 public static final int TYPE_GRAVITY = 9;
98
99 /**
100 * A constant describing a linear acceleration sensor type.
Scott Main92053f82013-06-13 16:32:50 -0700101 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
Kevin Powellf35fd952010-07-19 19:10:40 -0700102 * for more details.
103 */
104 public static final int TYPE_LINEAR_ACCELERATION = 10;
105
106 /**
107 * A constant describing a rotation vector sensor type.
Scott Main92053f82013-06-13 16:32:50 -0700108 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
Kevin Powellf35fd952010-07-19 19:10:40 -0700109 * for more details.
110 */
111 public static final int TYPE_ROTATION_VECTOR = 11;
112
Urs Fleisch58190512010-12-29 17:02:02 +0100113 /**
114 * A constant describing a relative humidity sensor type.
Scott Main92053f82013-06-13 16:32:50 -0700115 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
Urs Fleisch58190512010-12-29 17:02:02 +0100116 * for more details.
117 */
118 public static final int TYPE_RELATIVE_HUMIDITY = 12;
119
Scott Main92053f82013-06-13 16:32:50 -0700120 /** A constant describing an ambient temperature sensor type.
121 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values}
122 * for more details. */
Mathias Agopian462db222011-03-22 18:44:26 -0700123 public static final int TYPE_AMBIENT_TEMPERATURE = 13;
124
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800125 /**
Scott Main92053f82013-06-13 16:32:50 -0700126 * A constant describing an uncalibrated magnetic field sensor type.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800127 * <p>
Scott Main92053f82013-06-13 16:32:50 -0700128 * Similar to {@link #TYPE_MAGNETIC_FIELD} but the hard iron calibration (device calibration
129 * due to distortions that arise from magnetized iron, steel or permanent magnets on the
130 * device) is not considered in the given sensor values. However, such hard iron bias values
131 * are returned to you separately in the result {@link android.hardware.SensorEvent#values}
132 * so you may use them for custom calibrations.
133 * <p>Also, no periodic calibration is performed
134 * (i.e. there are no discontinuities in the data stream while using this sensor) and
135 * assumptions that the magnetic field is due to the Earth's poles is avoided, but
136 * factory calibration and temperature compensation have been performed.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800137 * </p>
Scott Main92053f82013-06-13 16:32:50 -0700138 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values} for more
139 * details.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800140 */
141 public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14;
142
143 /**
Scott Main92053f82013-06-13 16:32:50 -0700144 * A constant describing an uncalibrated rotation vector sensor type.
145 * <p>Identical to {@link #TYPE_ROTATION_VECTOR} except that it doesn't
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800146 * use the geomagnetic field. Therefore the Y axis doesn't
147 * point north, but instead to some other reference, that reference is
148 * allowed to drift by the same order of magnitude as the gyroscope
149 * drift around the Z axis.
150 * <p>
151 * In the ideal case, a phone rotated and returning to the same real-world
152 * orientation should report the same game rotation vector
153 * (without using the earth's geomagnetic field). However, the orientation
154 * may drift somewhat over time.
155 * </p>
Scott Main92053f82013-06-13 16:32:50 -0700156 * <p>See {@link android.hardware.SensorEvent#values SensorEvent.values} for more
157 * details.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800158 */
159
160 public static final int TYPE_GAME_ROTATION_VECTOR = 15;
161
162 /**
Scott Main92053f82013-06-13 16:32:50 -0700163 * A constant describing an uncalibrated gyroscope sensor type.
164 * <p>Similar to {@link #TYPE_GYROSCOPE} but no gyro-drift compensation has been performed
165 * to adjust the given sensor values. However, such gyro-drift bias values
166 * are returned to you separately in the result {@link android.hardware.SensorEvent#values}
167 * so you may use them for custom calibrations.
168 * <p>Factory calibration and temperature compensation is still applied
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800169 * to the rate of rotation (angular speeds).
170 * </p>
Scott Main92053f82013-06-13 16:32:50 -0700171 * <p> See {@link android.hardware.SensorEvent#values SensorEvent.values} for more
172 * details.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800173 */
174 public static final int TYPE_GYROSCOPE_UNCALIBRATED = 16;
175
176 /**
177 * A constant describing the significant motion trigger sensor.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800178 * <p>
179 * It triggers when an event occurs and then automatically disables
180 * itself. The sensor continues to operate while the device is asleep
181 * and will automatically wake the device to notify when significant
182 * motion is detected. The application does not need to hold any wake
183 * locks for this sensor to trigger.
Scott Main92053f82013-06-13 16:32:50 -0700184 * <p>See {@link TriggerEvent} for more details.
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800185 */
186 public static final int TYPE_SIGNIFICANT_MOTION = 17;
187
188 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189 * A constant describing all sensor types.
190 */
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700191 public static final int TYPE_ALL = -1;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800193 /* Reporting mode constants for sensors. Each sensor will have exactly one
194 reporting mode associated with it. */
195 // Events are reported at a constant rate.
196 static int REPORTING_MODE_CONTINUOUS = 1;
197
198 // Events are reported only when the value changes.
199 static int REPORTING_MODE_ON_CHANGE = 2;
200
201 // Upon detection of an event, the sensor deactivates itself and then sends a single event.
202 static int REPORTING_MODE_ONE_SHOT = 3;
203
Jaikumar Ganeshedb52422013-04-16 11:10:05 -0700204 // TODO(): The following arrays are fragile and error-prone. This needs to be refactored.
205
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800206 // Note: This needs to be updated, whenever a new sensor is added.
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700207 // Holds the reporting mode and maximum length of the values array
208 // associated with
209 // {@link SensorEvent} or {@link TriggerEvent} for the Sensor
210 private static final int[] sSensorReportingModes = {
211 0, 0, // padding because sensor types start at 1
212 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_ACCELEROMETER
213 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_GEOMAGNETIC_FIELD
214 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_ORIENTATION
215 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_GYROSCOPE
216 REPORTING_MODE_ON_CHANGE, 3, // SENSOR_TYPE_LIGHT
217 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_PRESSURE
218 REPORTING_MODE_ON_CHANGE, 3, // SENSOR_TYPE_TEMPERATURE
219 REPORTING_MODE_ON_CHANGE, 3, // SENSOR_TYPE_PROXIMITY
220 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_GRAVITY
221 REPORTING_MODE_CONTINUOUS, 3, // SENSOR_TYPE_LINEAR_ACCELERATION
222 REPORTING_MODE_CONTINUOUS, 5, // SENSOR_TYPE_ROTATION_VECTOR
223 REPORTING_MODE_ON_CHANGE, 3, // SENSOR_TYPE_RELATIVE_HUMIDITY
224 REPORTING_MODE_ON_CHANGE, 3, // SENSOR_TYPE_AMBIENT_TEMPERATURE
225 REPORTING_MODE_CONTINUOUS, 6, // SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED
226 REPORTING_MODE_CONTINUOUS, 4, // SENSOR_TYPE_GAME_ROTATION_VECTOR
227 REPORTING_MODE_CONTINUOUS, 6, // SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
228 REPORTING_MODE_ONE_SHOT, 1, // SENSOR_TYPE_SIGNIFICANT_MOTION
229 // added post 4.3
230 REPORTING_MODE_ON_CHANGE, 1, // SENSOR_TYPE_STEP_DETECTOR
231 REPORTING_MODE_ON_CHANGE, 1, // SENSOR_TYPE_STEP_COUNTER
232 REPORTING_MODE_CONTINUOUS, 5 // SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR
233 };
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700234
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800235 static int getReportingMode(Sensor sensor) {
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700236 int offset = sensor.mType * 2;
237 if (offset >= sSensorReportingModes.length) {
238 // we don't know about this sensor, so this is probably a
239 // vendor-defined sensor, in that case, we figure out the reporting
240 // mode from the sensor meta-data.
241 int minDelay = sensor.mMinDelay;
242 if (minDelay == 0) {
243 return REPORTING_MODE_ON_CHANGE;
244 } else if (minDelay < 0) {
245 return REPORTING_MODE_ONE_SHOT;
246 } else {
247 return REPORTING_MODE_CONTINUOUS;
248 }
249 }
250 return sSensorReportingModes[offset];
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800251 }
252
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700253 static int getMaxLengthValuesArray(Sensor sensor, int sdkLevel) {
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700254 int type = sensor.mType;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700255 // RotationVector length has changed to 3 to 5 for API level 18
256 // Set it to 3 for backward compatibility.
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700257 if (type == Sensor.TYPE_ROTATION_VECTOR &&
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700258 sdkLevel <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700259 return 3;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700260 }
Mathias Agopianb25c0ef2013-07-03 15:38:29 -0700261 int offset = type * 2 + 1;
262 if (offset >= sSensorReportingModes.length) {
263 // we don't know about this sensor, so this is probably a
264 // vendor-defined sensor, in that case, we don't know how many value
265 // it has
266 // so we return the maximum and assume the app will know.
267 // FIXME: sensor HAL should advertise how much data is returned per
268 // sensor
269 return 16;
270 }
271 return sSensorReportingModes[offset];
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700272 }
273
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700274 /* Some of these fields are set only by the native bindings in
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800275 * SensorManager.
276 */
277 private String mName;
278 private String mVendor;
279 private int mVersion;
280 private int mHandle;
281 private int mType;
282 private float mMaxRange;
283 private float mResolution;
284 private float mPower;
Mathias Agopian050b5622010-07-29 16:51:38 -0700285 private int mMinDelay;
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700286
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800287 Sensor() {
288 }
289
290 /**
291 * @return name string of the sensor.
292 */
293 public String getName() {
294 return mName;
295 }
296
297 /**
298 * @return vendor string of this sensor.
299 */
300 public String getVendor() {
301 return mVendor;
302 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700303
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800304 /**
305 * @return generic type of this sensor.
306 */
307 public int getType() {
308 return mType;
309 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700310
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311 /**
312 * @return version of the sensor's module.
313 */
314 public int getVersion() {
315 return mVersion;
316 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700317
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318 /**
319 * @return maximum range of the sensor in the sensor's unit.
320 */
321 public float getMaximumRange() {
322 return mMaxRange;
323 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700324
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 /**
326 * @return resolution of the sensor in the sensor's unit.
327 */
328 public float getResolution() {
329 return mResolution;
330 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700331
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800332 /**
333 * @return the power in mA used by this sensor while in use
334 */
335 public float getPower() {
336 return mPower;
337 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700338
Mathias Agopian050b5622010-07-29 16:51:38 -0700339 /**
340 * @return the minimum delay allowed between two events in microsecond
341 * or zero if this sensor only returns a value when the data it's measuring
342 * changes.
343 */
344 public int getMinDelay() {
345 return mMinDelay;
346 }
347
Mathias Agopian7f84c062013-02-04 19:22:47 -0800348 /** @hide */
349 public int getHandle() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800350 return mHandle;
351 }
Mathias Agopian74cde2c2010-06-16 18:55:46 -0700352
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800353 void setRange(float max, float res) {
354 mMaxRange = max;
355 mResolution = res;
356 }
Jeff Brown6a2ef122012-08-10 18:19:10 -0700357
358 @Override
359 public String toString() {
360 return "{Sensor name=\"" + mName + "\", vendor=\"" + mVendor + "\", version=" + mVersion
361 + ", type=" + mType + ", maxRange=" + mMaxRange + ", resolution=" + mResolution
362 + ", power=" + mPower + ", minDelay=" + mMinDelay + "}";
363 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364}