1 /* 2 * Copyright (C) 2010 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 <inttypes.h> 18 #include <stdint.h> 19 #include <sys/types.h> 20 #include <sys/limits.h> 21 22 #include <utils/Errors.h> 23 #include <utils/String8.h> 24 #include <utils/Flattenable.h> 25 26 #include <hardware/sensors.h> 27 28 #include <gui/Sensor.h> 29 #include <log/log.h> 30 31 // ---------------------------------------------------------------------------- 32 namespace android { 33 // ---------------------------------------------------------------------------- 34 35 Sensor::Sensor() 36 : mHandle(0), mType(0), 37 mMinValue(0), mMaxValue(0), mResolution(0), 38 mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0), 39 mMaxDelay(0), mFlags(0) 40 { 41 } 42 43 Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion) 44 { 45 mName = hwSensor->name; 46 mVendor = hwSensor->vendor; 47 mVersion = hwSensor->version; 48 mHandle = hwSensor->handle; 49 mType = hwSensor->type; 50 mMinValue = 0; // FIXME: minValue 51 mMaxValue = hwSensor->maxRange; // FIXME: maxValue 52 mResolution = hwSensor->resolution; 53 mPower = hwSensor->power; 54 mMinDelay = hwSensor->minDelay; 55 mFlags = 0; 56 57 // Set fifo event count zero for older devices which do not support batching. Fused 58 // sensors also have their fifo counts set to zero. 59 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0) { 60 mFifoReservedEventCount = hwSensor->fifoReservedEventCount; 61 mFifoMaxEventCount = hwSensor->fifoMaxEventCount; 62 } else { 63 mFifoReservedEventCount = 0; 64 mFifoMaxEventCount = 0; 65 } 66 67 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 68 if (hwSensor->maxDelay > INT_MAX) { 69 // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 70 // always fit in a 32 bit integer, log error and cap it to INT_MAX. 71 ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 72 static_cast<int64_t>(hwSensor->maxDelay)); 73 mMaxDelay = INT_MAX; 74 } else { 75 mMaxDelay = (int32_t) hwSensor->maxDelay; 76 } 77 } else { 78 // For older hals set maxDelay to 0. 79 mMaxDelay = 0; 80 } 81 82 // Ensure existing sensors have correct string type, required permissions and reporting mode. 83 // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity 84 // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older 85 // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors. 86 // All the OEM defined defined sensors have flags set to whatever is provided by the HAL. 87 switch (mType) { 88 case SENSOR_TYPE_ACCELEROMETER: 89 mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 90 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 91 break; 92 case SENSOR_TYPE_AMBIENT_TEMPERATURE: 93 mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 94 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 95 break; 96 case SENSOR_TYPE_GAME_ROTATION_VECTOR: 97 mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 98 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 99 break; 100 case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 101 mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 102 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 103 break; 104 case SENSOR_TYPE_GRAVITY: 105 mStringType = SENSOR_STRING_TYPE_GRAVITY; 106 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 107 break; 108 case SENSOR_TYPE_GYROSCOPE: 109 mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 110 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 111 break; 112 case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 113 mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 114 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 115 break; 116 case SENSOR_TYPE_HEART_RATE: 117 mStringType = SENSOR_STRING_TYPE_HEART_RATE; 118 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 119 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 120 break; 121 case SENSOR_TYPE_LIGHT: 122 mStringType = SENSOR_STRING_TYPE_LIGHT; 123 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 124 break; 125 case SENSOR_TYPE_LINEAR_ACCELERATION: 126 mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 127 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 128 break; 129 case SENSOR_TYPE_MAGNETIC_FIELD: 130 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 131 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 132 break; 133 case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 134 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 135 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 136 break; 137 case SENSOR_TYPE_ORIENTATION: 138 mStringType = SENSOR_STRING_TYPE_ORIENTATION; 139 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 140 break; 141 case SENSOR_TYPE_PRESSURE: 142 mStringType = SENSOR_STRING_TYPE_PRESSURE; 143 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 144 break; 145 case SENSOR_TYPE_PROXIMITY: 146 mStringType = SENSOR_STRING_TYPE_PROXIMITY; 147 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 148 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 149 mFlags |= SENSOR_FLAG_WAKE_UP; 150 } 151 break; 152 case SENSOR_TYPE_RELATIVE_HUMIDITY: 153 mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 154 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 155 break; 156 case SENSOR_TYPE_ROTATION_VECTOR: 157 mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 158 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 159 break; 160 case SENSOR_TYPE_SIGNIFICANT_MOTION: 161 mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 162 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 163 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 164 mFlags |= SENSOR_FLAG_WAKE_UP; 165 } 166 break; 167 case SENSOR_TYPE_STEP_COUNTER: 168 mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 169 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 170 break; 171 case SENSOR_TYPE_STEP_DETECTOR: 172 mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 173 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 174 break; 175 case SENSOR_TYPE_TEMPERATURE: 176 mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 177 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 178 break; 179 case SENSOR_TYPE_TILT_DETECTOR: 180 mStringType = SENSOR_STRING_TYPE_TILT_DETECTOR; 181 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 182 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 183 mFlags |= SENSOR_FLAG_WAKE_UP; 184 } 185 break; 186 case SENSOR_TYPE_WAKE_GESTURE: 187 mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 188 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 189 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 190 mFlags |= SENSOR_FLAG_WAKE_UP; 191 } 192 break; 193 case SENSOR_TYPE_GLANCE_GESTURE: 194 mStringType = SENSOR_STRING_TYPE_GLANCE_GESTURE; 195 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 196 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 197 mFlags |= SENSOR_FLAG_WAKE_UP; 198 } 199 break; 200 case SENSOR_TYPE_PICK_UP_GESTURE: 201 mStringType = SENSOR_STRING_TYPE_PICK_UP_GESTURE; 202 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 203 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 204 mFlags |= SENSOR_FLAG_WAKE_UP; 205 } 206 break; 207 default: 208 // Only pipe the stringType, requiredPermission and flags for custom sensors. 209 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor->stringType) { 210 mStringType = hwSensor->stringType; 211 } 212 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor->requiredPermission) { 213 mRequiredPermission = hwSensor->requiredPermission; 214 } 215 216 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 217 mFlags = (int32_t) hwSensor->flags; 218 } else { 219 // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 220 // reporting mode of the sensor. 221 if (mMinDelay > 0) { 222 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 223 } else if (mMinDelay == 0) { 224 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 225 } else if (mMinDelay < 0) { 226 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 227 } 228 } 229 break; 230 } 231 232 // For the newer HALs log errors if reporting mask flags are set incorrectly. 233 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 234 // Wake-up flag is set here. 235 mFlags |= (hwSensor->flags & SENSOR_FLAG_WAKE_UP); 236 if (mFlags != hwSensor->flags) { 237 int actualReportingMode = 238 (hwSensor->flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 239 int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 240 if (actualReportingMode != expectedReportingMode) { 241 ALOGE("Reporting Mode incorrect: sensor %s handle=%d type=%d " 242 "actual=%d expected=%d", 243 mName.string(), mHandle, mType, actualReportingMode, expectedReportingMode); 244 } 245 246 } 247 } 248 } 249 250 Sensor::~Sensor() 251 { 252 } 253 254 const String8& Sensor::getName() const { 255 return mName; 256 } 257 258 const String8& Sensor::getVendor() const { 259 return mVendor; 260 } 261 262 int32_t Sensor::getHandle() const { 263 return mHandle; 264 } 265 266 int32_t Sensor::getType() const { 267 return mType; 268 } 269 270 float Sensor::getMinValue() const { 271 return mMinValue; 272 } 273 274 float Sensor::getMaxValue() const { 275 return mMaxValue; 276 } 277 278 float Sensor::getResolution() const { 279 return mResolution; 280 } 281 282 float Sensor::getPowerUsage() const { 283 return mPower; 284 } 285 286 int32_t Sensor::getMinDelay() const { 287 return mMinDelay; 288 } 289 290 nsecs_t Sensor::getMinDelayNs() const { 291 return getMinDelay() * 1000; 292 } 293 294 int32_t Sensor::getVersion() const { 295 return mVersion; 296 } 297 298 int32_t Sensor::getFifoReservedEventCount() const { 299 return mFifoReservedEventCount; 300 } 301 302 int32_t Sensor::getFifoMaxEventCount() const { 303 return mFifoMaxEventCount; 304 } 305 306 const String8& Sensor::getStringType() const { 307 return mStringType; 308 } 309 310 const String8& Sensor::getRequiredPermission() const { 311 return mRequiredPermission; 312 } 313 314 int32_t Sensor::getMaxDelay() const { 315 return mMaxDelay; 316 } 317 318 int32_t Sensor::getFlags() const { 319 return mFlags; 320 } 321 322 bool Sensor::isWakeUpSensor() const { 323 return mFlags & SENSOR_FLAG_WAKE_UP; 324 } 325 326 int32_t Sensor::getReportingMode() const { 327 return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 328 } 329 330 size_t Sensor::getFlattenedSize() const 331 { 332 size_t fixedSize = 333 sizeof(int32_t) * 3 + 334 sizeof(float) * 4 + 335 sizeof(int32_t) * 5; 336 337 size_t variableSize = 338 sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 339 sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 340 sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 341 sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 342 343 return fixedSize + variableSize; 344 } 345 346 status_t Sensor::flatten(void* buffer, size_t size) const { 347 if (size < getFlattenedSize()) { 348 return NO_MEMORY; 349 } 350 351 flattenString8(buffer, size, mName); 352 flattenString8(buffer, size, mVendor); 353 FlattenableUtils::write(buffer, size, mVersion); 354 FlattenableUtils::write(buffer, size, mHandle); 355 FlattenableUtils::write(buffer, size, mType); 356 FlattenableUtils::write(buffer, size, mMinValue); 357 FlattenableUtils::write(buffer, size, mMaxValue); 358 FlattenableUtils::write(buffer, size, mResolution); 359 FlattenableUtils::write(buffer, size, mPower); 360 FlattenableUtils::write(buffer, size, mMinDelay); 361 FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 362 FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 363 flattenString8(buffer, size, mStringType); 364 flattenString8(buffer, size, mRequiredPermission); 365 FlattenableUtils::write(buffer, size, mMaxDelay); 366 FlattenableUtils::write(buffer, size, mFlags); 367 return NO_ERROR; 368 } 369 370 status_t Sensor::unflatten(void const* buffer, size_t size) { 371 if (!unflattenString8(buffer, size, mName)) { 372 return NO_MEMORY; 373 } 374 if (!unflattenString8(buffer, size, mVendor)) { 375 return NO_MEMORY; 376 } 377 378 size_t fixedSize = 379 sizeof(int32_t) * 3 + 380 sizeof(float) * 4 + 381 sizeof(int32_t) * 5; 382 if (size < fixedSize) { 383 return NO_MEMORY; 384 } 385 386 FlattenableUtils::read(buffer, size, mVersion); 387 FlattenableUtils::read(buffer, size, mHandle); 388 FlattenableUtils::read(buffer, size, mType); 389 FlattenableUtils::read(buffer, size, mMinValue); 390 FlattenableUtils::read(buffer, size, mMaxValue); 391 FlattenableUtils::read(buffer, size, mResolution); 392 FlattenableUtils::read(buffer, size, mPower); 393 FlattenableUtils::read(buffer, size, mMinDelay); 394 FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 395 FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 396 397 if (!unflattenString8(buffer, size, mStringType)) { 398 return NO_MEMORY; 399 } 400 if (!unflattenString8(buffer, size, mRequiredPermission)) { 401 return NO_MEMORY; 402 } 403 FlattenableUtils::read(buffer, size, mMaxDelay); 404 FlattenableUtils::read(buffer, size, mFlags); 405 return NO_ERROR; 406 } 407 408 void Sensor::flattenString8(void*& buffer, size_t& size, 409 const String8& string8) { 410 uint32_t len = string8.length(); 411 FlattenableUtils::write(buffer, size, len); 412 memcpy(static_cast<char*>(buffer), string8.string(), len); 413 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 414 } 415 416 bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 417 uint32_t len; 418 if (size < sizeof(len)) { 419 return false; 420 } 421 FlattenableUtils::read(buffer, size, len); 422 if (size < len) { 423 return false; 424 } 425 outputString8.setTo(static_cast<char const*>(buffer), len); 426 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 427 return true; 428 } 429 430 // ---------------------------------------------------------------------------- 431 }; // namespace android 432