1 /*
2 * Copyright (C) 2020 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 #include "sensor_list.h"
18
19 namespace goldfish {
20 using ahs::V2_1::SensorType;
21 using ahs::V1_0::SensorFlagBits;
22
23 constexpr char kAospVendor[] = "The Android Open Source Project";
24
25 const char* const kQemuSensorName[] = {
26 "acceleration",
27 "gyroscope",
28 "magnetic-field",
29 "orientation",
30 "temperature",
31 "proximity",
32 "light",
33 "pressure",
34 "humidity",
35 "magnetic-field-uncalibrated",
36 "gyroscope-uncalibrated",
37 "hinge-angle0",
38 "hinge-angle1",
39 "hinge-angle2",
40 "heart-rate",
41 "rgbc-light",
42 "wrist-tilt",
43 "acceleration-uncalibrated",
44 };
45
46 const SensorInfo kAllSensors[] = {
47 {
48 .sensorHandle = kSensorHandleAccelerometer,
49 .name = "Goldfish 3-axis Accelerometer",
50 .vendor = kAospVendor,
51 .version = 1,
52 .type = SensorType::ACCELEROMETER,
53 .typeAsString = "android.sensor.accelerometer",
54 .maxRange = 39.3,
55 .resolution = 1.0 / 4032.0,
56 .power = 3.0,
57 .minDelay = 10000,
58 .fifoReservedEventCount = 0,
59 .fifoMaxEventCount = 0,
60 .requiredPermission = "",
61 .maxDelay = 500000,
62 .flags = SensorFlagBits::DATA_INJECTION |
63 SensorFlagBits::ADDITIONAL_INFO |
64 SensorFlagBits::CONTINUOUS_MODE
65 },
66 {
67 .sensorHandle = kSensorHandleGyroscope,
68 .name = "Goldfish 3-axis Gyroscope",
69 .vendor = kAospVendor,
70 .version = 1,
71 .type = SensorType::GYROSCOPE,
72 .typeAsString = "android.sensor.gyroscope",
73 .maxRange = 16.46,
74 .resolution = 1.0 / 1000.0,
75 .power = 3.0,
76 .minDelay = 10000,
77 .fifoReservedEventCount = 0,
78 .fifoMaxEventCount = 0,
79 .requiredPermission = "",
80 .maxDelay = 500000,
81 .flags = SensorFlagBits::DATA_INJECTION |
82 SensorFlagBits::ADDITIONAL_INFO |
83 SensorFlagBits::CONTINUOUS_MODE
84 },
85 {
86 .sensorHandle = kSensorHandleMagneticField,
87 .name = "Goldfish 3-axis Magnetic field sensor",
88 .vendor = kAospVendor,
89 .version = 1,
90 .type = SensorType::MAGNETIC_FIELD,
91 .typeAsString = "android.sensor.magnetic_field",
92 .maxRange = 2000.0,
93 .resolution = .5,
94 .power = 6.7,
95 .minDelay = 10000,
96 .fifoReservedEventCount = 0,
97 .fifoMaxEventCount = 0,
98 .requiredPermission = "",
99 .maxDelay = 500000,
100 .flags = SensorFlagBits::DATA_INJECTION |
101 SensorFlagBits::CONTINUOUS_MODE
102 },
103 {
104 .sensorHandle = kSensorHandleOrientation,
105 .name = "Goldfish Orientation sensor",
106 .vendor = kAospVendor,
107 .version = 1,
108 .type = SensorType::ORIENTATION,
109 .typeAsString = "android.sensor.orientation",
110 .maxRange = 360.0,
111 .resolution = 1.0,
112 .power = 9.7,
113 .minDelay = 10000,
114 .fifoReservedEventCount = 0,
115 .fifoMaxEventCount = 0,
116 .requiredPermission = "",
117 .maxDelay = 500000,
118 .flags = SensorFlagBits::DATA_INJECTION |
119 SensorFlagBits::CONTINUOUS_MODE
120 },
121 {
122 .sensorHandle = kSensorHandleAmbientTemperature,
123 .name = "Goldfish Ambient Temperature sensor",
124 .vendor = kAospVendor,
125 .version = 1,
126 .type = SensorType::AMBIENT_TEMPERATURE,
127 .typeAsString = "android.sensor.ambient_temperature",
128 .maxRange = 80.0,
129 .resolution = 1.0,
130 .power = 0.0,
131 .minDelay = 0,
132 .fifoReservedEventCount = 0,
133 .fifoMaxEventCount = 0,
134 .requiredPermission = "",
135 .maxDelay = 0,
136 .flags = SensorFlagBits::DATA_INJECTION |
137 SensorFlagBits::ON_CHANGE_MODE
138 },
139 {
140 .sensorHandle = kSensorHandleProximity,
141 .name = "Goldfish Proximity sensor",
142 .vendor = kAospVendor,
143 .version = 1,
144 .type = SensorType::PROXIMITY,
145 .typeAsString = "android.sensor.proximity",
146 .maxRange = 1.0,
147 .resolution = 1.0,
148 .power = 20.0,
149 .minDelay = 0,
150 .fifoReservedEventCount = 0,
151 .fifoMaxEventCount = 0,
152 .requiredPermission = "",
153 .maxDelay = 0,
154 .flags = SensorFlagBits::DATA_INJECTION |
155 SensorFlagBits::ON_CHANGE_MODE |
156 SensorFlagBits::WAKE_UP
157 },
158 {
159 .sensorHandle = kSensorHandleLight,
160 .name = "Goldfish Light sensor",
161 .vendor = kAospVendor,
162 .version = 1,
163 .type = SensorType::LIGHT,
164 .typeAsString = "android.sensor.light",
165 .maxRange = 40000.0,
166 .resolution = 1.0,
167 .power = 20.0,
168 .minDelay = 0,
169 .fifoReservedEventCount = 0,
170 .fifoMaxEventCount = 0,
171 .requiredPermission = "",
172 .maxDelay = 0,
173 .flags = SensorFlagBits::DATA_INJECTION |
174 SensorFlagBits::ON_CHANGE_MODE
175 },
176 {
177 .sensorHandle = kSensorHandlePressure,
178 .name = "Goldfish Pressure sensor",
179 .vendor = kAospVendor,
180 .version = 1,
181 .type = SensorType::PRESSURE,
182 .typeAsString = "android.sensor.pressure",
183 .maxRange = 800.0,
184 .resolution = 1.0,
185 .power = 20.0,
186 .minDelay = 10000,
187 .fifoReservedEventCount = 0,
188 .fifoMaxEventCount = 0,
189 .requiredPermission = "",
190 .maxDelay = 500000,
191 .flags = SensorFlagBits::DATA_INJECTION |
192 SensorFlagBits::CONTINUOUS_MODE
193 },
194 {
195 .sensorHandle = kSensorHandleRelativeHumidity,
196 .name = "Goldfish Humidity sensor",
197 .vendor = kAospVendor,
198 .version = 1,
199 .type = SensorType::RELATIVE_HUMIDITY,
200 .typeAsString = "android.sensor.relative_humidity",
201 .maxRange = 100.0,
202 .resolution = 1.0,
203 .power = 20.0,
204 .minDelay = 0,
205 .fifoReservedEventCount = 0,
206 .fifoMaxEventCount = 0,
207 .requiredPermission = "",
208 .maxDelay = 0,
209 .flags = SensorFlagBits::DATA_INJECTION |
210 SensorFlagBits::ON_CHANGE_MODE
211 },
212 {
213 .sensorHandle = kSensorHandleMagneticFieldUncalibrated,
214 .name = "Goldfish 3-axis Magnetic field sensor (uncalibrated)",
215 .vendor = kAospVendor,
216 .version = 1,
217 .type = SensorType::MAGNETIC_FIELD_UNCALIBRATED,
218 .typeAsString = "android.sensor.magnetic_field_uncalibrated",
219 .maxRange = 2000.0,
220 .resolution = 0.5,
221 .power = 6.7,
222 .minDelay = 10000,
223 .fifoReservedEventCount = 0,
224 .fifoMaxEventCount = 0,
225 .requiredPermission = "",
226 .maxDelay = 500000,
227 .flags = SensorFlagBits::DATA_INJECTION | 0
228 },
229 {
230 .sensorHandle = kSensorHandleGyroscopeFieldUncalibrated,
231 .name = "Goldfish 3-axis Gyroscope (uncalibrated)",
232 .vendor = kAospVendor,
233 .version = 1,
234 .type = SensorType::GYROSCOPE_UNCALIBRATED,
235 .typeAsString = "android.sensor.gyroscope_uncalibrated",
236 .maxRange = 16.46,
237 .resolution = 1.0 / 1000.0,
238 .power = 3.0,
239 .minDelay = 10000,
240 .fifoReservedEventCount = 0,
241 .fifoMaxEventCount = 0,
242 .requiredPermission = "",
243 .maxDelay = 500000,
244 .flags = SensorFlagBits::DATA_INJECTION |
245 SensorFlagBits::CONTINUOUS_MODE
246 },
247 {
248 .sensorHandle = kSensorHandleHingeAngle0,
249 .name = "Goldfish hinge sensor0 (in degrees)",
250 .vendor = kAospVendor,
251 .version = 1,
252 .type = SensorType::HINGE_ANGLE,
253 .typeAsString = "android.sensor.hinge_angle",
254 .maxRange = 360,
255 .resolution = 1.0,
256 .power = 3.0,
257 .minDelay = 0,
258 .fifoReservedEventCount = 0,
259 .fifoMaxEventCount = 0,
260 .requiredPermission = "",
261 .maxDelay = 0,
262 .flags = SensorFlagBits::DATA_INJECTION |
263 SensorFlagBits::ON_CHANGE_MODE |
264 SensorFlagBits::WAKE_UP
265 },
266 {
267 .sensorHandle = kSensorHandleHingeAngle1,
268 .name = "Goldfish hinge sensor1 (in degrees)",
269 .vendor = kAospVendor,
270 .version = 1,
271 .type = SensorType::HINGE_ANGLE,
272 .typeAsString = "android.sensor.hinge_angle",
273 .maxRange = 360,
274 .resolution = 1.0,
275 .power = 3.0,
276 .minDelay = 0,
277 .fifoReservedEventCount = 0,
278 .fifoMaxEventCount = 0,
279 .requiredPermission = "",
280 .maxDelay = 0,
281 .flags = SensorFlagBits::DATA_INJECTION |
282 SensorFlagBits::ON_CHANGE_MODE |
283 SensorFlagBits::WAKE_UP
284 },
285 {
286 .sensorHandle = kSensorHandleHingeAngle2,
287 .name = "Goldfish hinge sensor2 (in degrees)",
288 .vendor = kAospVendor,
289 .version = 1,
290 .type = SensorType::HINGE_ANGLE,
291 .typeAsString = "android.sensor.hinge_angle",
292 .maxRange = 360,
293 .resolution = 1.0,
294 .power = 3.0,
295 .minDelay = 0,
296 .fifoReservedEventCount = 0,
297 .fifoMaxEventCount = 0,
298 .requiredPermission = "",
299 .maxDelay = 0,
300 .flags = SensorFlagBits::DATA_INJECTION |
301 SensorFlagBits::ON_CHANGE_MODE |
302 SensorFlagBits::WAKE_UP
303 },
304 {
305 .sensorHandle = kSensorHandleHeartRate,
306 .name = "Goldfish Heart rate sensor",
307 .vendor = kAospVendor,
308 .version = 1,
309 .type = SensorType::HEART_RATE,
310 .typeAsString = "android.sensor.heart_rate",
311 .maxRange = 500.0,
312 .resolution = 1.0,
313 .power = 20.0,
314 .minDelay = 0,
315 .fifoReservedEventCount = 0,
316 .fifoMaxEventCount = 0,
317 .requiredPermission = "android.permission.BODY_SENSORS",
318 .maxDelay = 500000,
319 .flags = SensorFlagBits::DATA_INJECTION |
320 SensorFlagBits::ON_CHANGE_MODE
321 },
322 {
323 // rgbc-light
324 },
325 {
326 .sensorHandle = kSensorHandleWristTilt,
327 .name = "Goldfish wrist tilt gesture sensor",
328 .vendor = kAospVendor,
329 .version = 1,
330 .type = SensorType::WRIST_TILT_GESTURE,
331 .typeAsString = "android.sensor.wrist_tilt_gesture",
332 .maxRange = 1.0,
333 .resolution = 1.0,
334 .power = 20.0,
335 .minDelay = 0,
336 .fifoReservedEventCount = 0,
337 .fifoMaxEventCount = 0,
338 .maxDelay = 500000,
339 .flags = SensorFlagBits::DATA_INJECTION |
340 SensorFlagBits::SPECIAL_REPORTING_MODE |
341 SensorFlagBits::WAKE_UP
342 },
343 {
344 .sensorHandle = kSensorHandleAccelerometerUncalibrated,
345 .name = "Goldfish 3-axis Accelerometer Uncalibrated",
346 .vendor = kAospVendor,
347 .version = 1,
348 .type = SensorType::ACCELEROMETER_UNCALIBRATED,
349 .typeAsString = "android.sensor.accelerometer_uncalibrated",
350 .maxRange = 39.3,
351 .resolution = 1.0 / 4032.0,
352 .power = 3.0,
353 .minDelay = 10000,
354 .fifoReservedEventCount = 0,
355 .fifoMaxEventCount = 0,
356 .requiredPermission = "",
357 .maxDelay = 500000,
358 .flags = SensorFlagBits::DATA_INJECTION |
359 SensorFlagBits::ADDITIONAL_INFO |
360 SensorFlagBits::CONTINUOUS_MODE
361 }};
362
363 constexpr int kSensorNumber = sizeof(kAllSensors) / sizeof(kAllSensors[0]);
364
365 static_assert(kSensorNumber == sizeof(kQemuSensorName) / sizeof(kQemuSensorName[0]),
366 "sizes of kAllSensors and kQemuSensorName arrays must match");
367
getSensorNumber()368 int getSensorNumber() { return kSensorNumber; }
369
isSensorHandleValid(const int h)370 bool isSensorHandleValid(const int h) {
371 return h >= 0 && h < kSensorNumber;
372 }
373
getSensorInfoByHandle(const int h)374 const SensorInfo* getSensorInfoByHandle(const int h) {
375 return isSensorHandleValid(h) ? &kAllSensors[h] : nullptr;
376 }
377
getQemuSensorNameByHandle(const int h)378 const char* getQemuSensorNameByHandle(const int h) {
379 return kQemuSensorName[h];
380 }
381
382 } // namespace goldfish
383