blob: 5ff627f48017cdb2bfa4c2e548ea77f02754f9dd [file] [log] [blame]
Peng Xua2958352016-01-26 18:42:17 -08001/*
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
17package android.hardware;
18
19import android.annotation.IntDef;
20
21import java.lang.annotation.Retention;
22import java.lang.annotation.RetentionPolicy;
23
24/**
25 * This class represents a {@link android.hardware.Sensor Sensor} additional information frame,
26 * which is reported through listener callback {@link
27 * android.hardware.SensorEventCallback#onSensorAdditionalInfo onSensorAdditionalInfo}.
28 *
29 * @see SensorManager
Peng Xufb1c9412016-03-29 21:50:43 -070030 * @see SensorEventCallback
Peng Xua2958352016-01-26 18:42:17 -080031 * @see Sensor
32 *
33 */
34
35public class SensorAdditionalInfo {
36
37 /**
38 * The sensor that generated this event. See
39 * {@link android.hardware.SensorManager SensorManager} for details.
40 */
41 public final Sensor sensor;
42
43 /**
44 * Type of this additional info frame.
45 */
46 public final int type;
47
48 /**
49 * Sequence number of frame for a certain type.
50 */
51 public final int serial;
52
53 /**
54 * Additional info payload data represented in float values. Depending on the type of
55 * information, this may be null.
56 */
57 public final float[] floatValues;
58
59 /**
60 * Additional info payload data represented in int values. Depending on the type of information,
61 * this may be null.
62 */
63 public final int[] intValues;
64
65 /**
66 * Typical values of additional infomation type. The set of values is subject to extension in
67 * newer versions and vendors have the freedom of define their own custom values.
68 *
69 * @hide
70 */
Jeff Sharkeyce8db992017-12-13 20:05:05 -070071 @IntDef(prefix = { "TYPE_" }, value = {
72 TYPE_FRAME_BEGIN,
73 TYPE_FRAME_END,
74 TYPE_UNTRACKED_DELAY,
75 TYPE_INTERNAL_TEMPERATURE,
76 TYPE_VEC3_CALIBRATION,
77 TYPE_SENSOR_PLACEMENT,
78 TYPE_SAMPLING
79 })
Peng Xua2958352016-01-26 18:42:17 -080080 @Retention(RetentionPolicy.SOURCE)
81 public @interface AdditionalInfoType {}
82
83 /**
84 * Mark the beginning of a set of additional info frames.
85 */
86 public static final int TYPE_FRAME_BEGIN = 0;
87
88 /**
89 * Mark the end of a set of additional info frames.
90 */
91 public static final int TYPE_FRAME_END = 1;
92
93 /**
94 * Untracked delay. Delays that are introduced by data processing, such as filtering, which is
95 * not taken into account by sensor timestamps.
96 *
97 * Payload:
98 * floatValues[0]: delay estimation in seconds
99 * floatValues[1]: delay estimation standard deviation
100 */
101 public static final int TYPE_UNTRACKED_DELAY = 0x10000;
102
103 /**
104 * Internal temperature. Sensor hardware device internal temperature.
105 *
106 * Payload:
107 * floatValues[0]: internal temperature in Celsius.
108 */
109 public static final int TYPE_INTERNAL_TEMPERATURE = 0x10001;
110
111 /**
112 * Vector calibration parameter. Calibration applied to a sensor with 3 elements vector output,
113 * such as accelerometer, gyro, etc.
114 *
115 * Payload:
Peng Xufb1c9412016-03-29 21:50:43 -0700116 * floatValues[0..11]: First 3 rows of a homogeneous matrix in row major order that captures
Peng Xua2958352016-01-26 18:42:17 -0800117 * any linear transformation, including rotation, scaling, shear, shift.
118 */
119 public static final int TYPE_VEC3_CALIBRATION = 0x10002;
120
121 /**
122 * Sensor placement. Describes location and installation angle of the sensor device.
123 *
124 * Payload:
125 * floatValues[0..11]: First 3 rows of homogeneous matrix in row major order that describes
126 * the location and orientation of the sensor. Origin of reference will be the mobile device
127 * geometric sensor. Reference frame is defined as the same as Android sensor frame.
128 */
129 public static final int TYPE_SENSOR_PLACEMENT = 0x10003;
130
131 /**
132 * Sampling parameter. Describes the raw sample period and estimated jitter of sample time in
133 * terms of standard deviation.
134 *
135 * Payload:
136 * floatValues[0]: raw sample period in seconds.
137 * floatValues[1]: standard deviation of sampling period.
138 */
139 public static final int TYPE_SAMPLING = 0x10004;
140
Peng Xu1cfde252017-01-19 17:10:09 -0800141 /**
142 * Local geo-magnetic Field.
143 *
144 * Additional into to sensor hardware. Local geomagnetic field information based on
145 * device geo location. This type is primarily for for magnetic field calibration and rotation
146 * vector sensor fusion.
147 *
148 * float[3]: strength (uT), declination and inclination angle (rad).
149 * @hide
150 */
151 public static final int TYPE_LOCAL_GEOMAGNETIC_FIELD = 0x30000;
152
153 /**
154 * Local gravity acceleration strength.
155 *
156 * Additional info to sensor hardware for accelerometer calibration.
157 *
158 * float: gravitational acceleration norm in m/s^2.
159 * @hide
160 */
161 public static final int TYPE_LOCAL_GRAVITY = 0x30001;
162
163 /**
164 * Device dock state.
165 *
166 * Additional info to sensor hardware indicating dock states of device.
167 *
168 * int32_t: dock state following definition of {@link android.content.Intent#EXTRA_DOCK_STATE}.
169 * Undefined values are ignored.
170 * @hide
171 */
172 public static final int TYPE_DOCK_STATE = 0x30002;
173
174 /**
175 * High performance mode.
176 *
177 * Additional info to sensor hardware. Device is able to use up more power and take more
178 * resources to improve throughput and latency in high performance mode. One possible use case
179 * is virtual reality, when sensor latency need to be carefully controlled.
180 *
181 * int32_t: 1 or 0, denoting device is in or out of high performance mode, respectively.
182 * Other values are ignored.
183 * @hide
184 */
185 public static final int TYPE_HIGH_PERFORMANCE_MODE = 0x30003;
186
187 /**
188 * Magnetic field calibration hint.
189 *
190 * Additional info to sensor hardware. Device is notified when manually triggered magnetic field
191 * calibration procedure is started or stopped. The calibration procedure is assumed timed out
192 * after 1 minute from start, even if an explicit stop is not received.
193 *
194 * int32_t: 1 for calibration start, 0 for stop, other values are ignored.
195 * @hide
196 */
197 public static final int TYPE_MAGNETIC_FIELD_CALIBRATION = 0x30004;
198
Alexey Polyudov29ad6b32017-05-23 19:54:26 -0700199 /**
200 * Custom sensor info: array of float values interpreted by sensor based on the type
201 * Any type between TYPE_CUSTOM_INFO <= info_type < TYPE_DEBUG_INFO may be
202 * used to send custom sensor info.
203 * @hide
204 */
205 public static final int TYPE_CUSTOM_INFO = 0x10000000;
206 /** @hide */
207 public static final int TYPE_DEBUG_INFO = 0x40000000;
208
Peng Xua2958352016-01-26 18:42:17 -0800209 SensorAdditionalInfo(
Peng Xu62f2c872017-09-22 11:50:33 -0700210 Sensor aSensor, int aType, int aSerial, int[] aIntValues, float[] aFloatValues) {
Peng Xua2958352016-01-26 18:42:17 -0800211 sensor = aSensor;
212 type = aType;
213 serial = aSerial;
214 intValues = aIntValues;
215 floatValues = aFloatValues;
216 }
Peng Xu1cfde252017-01-19 17:10:09 -0800217
218 /** @hide */
219 public static SensorAdditionalInfo createLocalGeomagneticField(
220 float strength, float declination, float inclination) {
221 if (strength < 10 || strength > 100 // much beyond extreme values on earth
222 || declination < 0 || declination > Math.PI
223 || inclination < -Math.PI / 2 || inclination > Math.PI / 2) {
224 throw new IllegalArgumentException("Geomagnetic field info out of range");
225 }
226
227 return new SensorAdditionalInfo(
228 null, TYPE_LOCAL_GEOMAGNETIC_FIELD, 0,
229 null, new float[] { strength, declination, inclination});
230 }
Alexey Polyudov29ad6b32017-05-23 19:54:26 -0700231 /** @hide */
Peng Xu62f2c872017-09-22 11:50:33 -0700232 public static SensorAdditionalInfo createCustomInfo(Sensor aSensor, int type, float[] data) {
Alexey Polyudov29ad6b32017-05-23 19:54:26 -0700233 if (type < TYPE_CUSTOM_INFO || type >= TYPE_DEBUG_INFO || aSensor == null) {
Peng Xu62f2c872017-09-22 11:50:33 -0700234 throw new IllegalArgumentException(
235 "invalid parameter(s): type: " + type + "; sensor: " + aSensor);
Alexey Polyudov29ad6b32017-05-23 19:54:26 -0700236 }
237
238 return new SensorAdditionalInfo(aSensor, type, 0, null, data);
239 }
Peng Xua2958352016-01-26 18:42:17 -0800240}