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 package android.hardware;
18 
19 import android.annotation.IntDef;
20 
21 import java.lang.annotation.Retention;
22 import 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
30  * @see SensorEventCallback
31  * @see Sensor
32  *
33  */
34 
35 public 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      */
71     @IntDef({TYPE_FRAME_BEGIN, TYPE_FRAME_END, TYPE_UNTRACKED_DELAY, TYPE_INTERNAL_TEMPERATURE,
72              TYPE_VEC3_CALIBRATION, TYPE_SENSOR_PLACEMENT, TYPE_SAMPLING})
73     @Retention(RetentionPolicy.SOURCE)
74     public @interface AdditionalInfoType {}
75 
76     /**
77      * Mark the beginning of a set of additional info frames.
78      */
79     public static final int TYPE_FRAME_BEGIN = 0;
80 
81     /**
82      * Mark the end of a set of additional info frames.
83      */
84     public static final int TYPE_FRAME_END = 1;
85 
86     /**
87      * Untracked delay. Delays that are introduced by data processing, such as filtering, which is
88      * not taken into account by sensor timestamps.
89      *
90      * Payload:
91      *     floatValues[0]: delay estimation in seconds
92      *     floatValues[1]: delay estimation standard deviation
93      */
94     public static final int TYPE_UNTRACKED_DELAY = 0x10000;
95 
96     /**
97      * Internal temperature. Sensor hardware device internal temperature.
98      *
99      * Payload:
100      *     floatValues[0]: internal temperature in Celsius.
101      */
102     public static final int TYPE_INTERNAL_TEMPERATURE = 0x10001;
103 
104     /**
105      * Vector calibration parameter. Calibration applied to a sensor with 3 elements vector output,
106      * such as accelerometer, gyro, etc.
107      *
108      * Payload:
109      *     floatValues[0..11]: First 3 rows of a homogeneous matrix in row major order that captures
110      *     any linear transformation, including rotation, scaling, shear, shift.
111      */
112     public static final int TYPE_VEC3_CALIBRATION = 0x10002;
113 
114     /**
115      * Sensor placement. Describes location and installation angle of the sensor device.
116      *
117      * Payload:
118      *     floatValues[0..11]: First 3 rows of homogeneous matrix in row major order that describes
119      *     the location and orientation of the sensor. Origin of reference will be the mobile device
120      *     geometric sensor. Reference frame is defined as the same as Android sensor frame.
121      */
122     public static final int TYPE_SENSOR_PLACEMENT = 0x10003;
123 
124     /**
125      * Sampling parameter. Describes the raw sample period and estimated jitter of sample time in
126      * terms of standard deviation.
127      *
128      * Payload:
129      *     floatValues[0]: raw sample period in seconds.
130      *     floatValues[1]: standard deviation of sampling period.
131      */
132     public static final int TYPE_SAMPLING = 0x10004;
133 
134     /**
135      * Local geo-magnetic Field.
136      *
137      * Additional into to sensor hardware.  Local geomagnetic field information based on
138      * device geo location. This type is primarily for for magnetic field calibration and rotation
139      * vector sensor fusion.
140      *
141      * float[3]: strength (uT), declination and inclination angle (rad).
142      * @hide
143      */
144     public static final int TYPE_LOCAL_GEOMAGNETIC_FIELD = 0x30000;
145 
146     /**
147      * Local gravity acceleration strength.
148      *
149      * Additional info to sensor hardware for accelerometer calibration.
150      *
151      * float: gravitational acceleration norm in m/s^2.
152      * @hide
153      */
154     public static final int TYPE_LOCAL_GRAVITY = 0x30001;
155 
156     /**
157      * Device dock state.
158      *
159      * Additional info to sensor hardware indicating dock states of device.
160      *
161      * int32_t: dock state following definition of {@link android.content.Intent#EXTRA_DOCK_STATE}.
162      *          Undefined values are ignored.
163      * @hide
164      */
165     public static final int TYPE_DOCK_STATE = 0x30002;
166 
167     /**
168      * High performance mode.
169      *
170      * Additional info to sensor hardware. Device is able to use up more power and take more
171      * resources to improve throughput and latency in high performance mode. One possible use case
172      * is virtual reality, when sensor latency need to be carefully controlled.
173      *
174      * int32_t: 1 or 0, denoting device is in or out of high performance mode, respectively.
175      *          Other values are ignored.
176      * @hide
177      */
178     public static final int TYPE_HIGH_PERFORMANCE_MODE = 0x30003;
179 
180     /**
181      * Magnetic field calibration hint.
182      *
183      * Additional info to sensor hardware. Device is notified when manually triggered magnetic field
184      * calibration procedure is started or stopped. The calibration procedure is assumed timed out
185      * after 1 minute from start, even if an explicit stop is not received.
186      *
187      * int32_t: 1 for calibration start, 0 for stop, other values are ignored.
188      * @hide
189      */
190     public static final int TYPE_MAGNETIC_FIELD_CALIBRATION = 0x30004;
191 
SensorAdditionalInfo( Sensor aSensor, int aType, int aSerial, int [] aIntValues, float [] aFloatValues)192     SensorAdditionalInfo(
193             Sensor aSensor, int aType, int aSerial, int [] aIntValues, float [] aFloatValues) {
194         sensor = aSensor;
195         type = aType;
196         serial = aSerial;
197         intValues = aIntValues;
198         floatValues = aFloatValues;
199     }
200 
201     /** @hide */
createLocalGeomagneticField( float strength, float declination, float inclination)202     public static SensorAdditionalInfo createLocalGeomagneticField(
203             float strength, float declination, float inclination) {
204         if (strength < 10 || strength > 100 // much beyond extreme values on earth
205                 || declination < 0 || declination > Math.PI
206                 || inclination < -Math.PI / 2 || inclination > Math.PI / 2) {
207             throw new IllegalArgumentException("Geomagnetic field info out of range");
208         }
209 
210         return new SensorAdditionalInfo(
211                 null, TYPE_LOCAL_GEOMAGNETIC_FIELD, 0,
212                 null, new float[] { strength, declination, inclination});
213     }
214 }
215