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