Sensor.cpp revision 8f515ce1c57379cafac4357bc4fdb61dd346ec5f
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// ---------------------------------------------------------------------------- 32namespace android { 33// ---------------------------------------------------------------------------- 34 35Sensor::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), mWakeUpSensor(false) 40{ 41} 42 43Sensor::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 mWakeUpSensor = false; 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_1) { 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 and required 83 // permissions. 84 switch (mType) { 85 case SENSOR_TYPE_ACCELEROMETER: 86 mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 87 break; 88 case SENSOR_TYPE_AMBIENT_TEMPERATURE: 89 mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 90 break; 91 case SENSOR_TYPE_GAME_ROTATION_VECTOR: 92 mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 93 break; 94 case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 95 mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 96 break; 97 case SENSOR_TYPE_GRAVITY: 98 mStringType = SENSOR_STRING_TYPE_GRAVITY; 99 break; 100 case SENSOR_TYPE_GYROSCOPE: 101 mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 102 break; 103 case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 104 mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 105 break; 106 case SENSOR_TYPE_HEART_RATE: 107 mStringType = SENSOR_STRING_TYPE_HEART_RATE; 108 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 109 break; 110 case SENSOR_TYPE_LIGHT: 111 mStringType = SENSOR_STRING_TYPE_LIGHT; 112 break; 113 case SENSOR_TYPE_LINEAR_ACCELERATION: 114 mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 115 break; 116 case SENSOR_TYPE_MAGNETIC_FIELD: 117 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 118 break; 119 case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 120 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 121 break; 122 case SENSOR_TYPE_ORIENTATION: 123 mStringType = SENSOR_STRING_TYPE_ORIENTATION; 124 break; 125 case SENSOR_TYPE_PRESSURE: 126 mStringType = SENSOR_STRING_TYPE_PRESSURE; 127 break; 128 case SENSOR_TYPE_PROXIMITY: 129 mStringType = SENSOR_STRING_TYPE_PROXIMITY; 130 mWakeUpSensor = true; 131 break; 132 case SENSOR_TYPE_RELATIVE_HUMIDITY: 133 mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 134 break; 135 case SENSOR_TYPE_ROTATION_VECTOR: 136 mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 137 break; 138 case SENSOR_TYPE_SIGNIFICANT_MOTION: 139 mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 140 mWakeUpSensor = true; 141 break; 142 case SENSOR_TYPE_STEP_COUNTER: 143 mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 144 break; 145 case SENSOR_TYPE_STEP_DETECTOR: 146 mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 147 break; 148 case SENSOR_TYPE_TEMPERATURE: 149 mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 150 break; 151 case SENSOR_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR: 152 mStringType = SENSOR_STRING_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR; 153 break; 154 case SENSOR_TYPE_WAKE_UP_ACCELEROMETER: 155 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ACCELEROMETER; 156 mWakeUpSensor = true; 157 break; 158 case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD: 159 mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD; 160 mWakeUpSensor = true; 161 break; 162 case SENSOR_TYPE_WAKE_UP_ORIENTATION: 163 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ORIENTATION; 164 mWakeUpSensor = true; 165 break; 166 case SENSOR_TYPE_WAKE_UP_GYROSCOPE: 167 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE; 168 mWakeUpSensor = true; 169 break; 170 case SENSOR_TYPE_WAKE_UP_LIGHT: 171 mStringType = SENSOR_STRING_TYPE_WAKE_UP_LIGHT; 172 mWakeUpSensor = true; 173 break; 174 case SENSOR_TYPE_WAKE_UP_PRESSURE: 175 mStringType = SENSOR_STRING_TYPE_WAKE_UP_PRESSURE; 176 mWakeUpSensor = true; 177 break; 178 case SENSOR_TYPE_WAKE_UP_GRAVITY: 179 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GRAVITY; 180 mWakeUpSensor = true; 181 break; 182 case SENSOR_TYPE_WAKE_UP_LINEAR_ACCELERATION: 183 mStringType = SENSOR_STRING_TYPE_WAKE_UP_LINEAR_ACCELERATION; 184 mWakeUpSensor = true; 185 break; 186 case SENSOR_TYPE_WAKE_UP_ROTATION_VECTOR: 187 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ROTATION_VECTOR; 188 mWakeUpSensor = true; 189 break; 190 case SENSOR_TYPE_WAKE_UP_RELATIVE_HUMIDITY: 191 mStringType = SENSOR_STRING_TYPE_WAKE_UP_RELATIVE_HUMIDITY; 192 mWakeUpSensor = true; 193 break; 194 case SENSOR_TYPE_WAKE_UP_AMBIENT_TEMPERATURE: 195 mStringType = SENSOR_STRING_TYPE_WAKE_UP_AMBIENT_TEMPERATURE; 196 mWakeUpSensor = true; 197 break; 198 case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED: 199 mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED; 200 mWakeUpSensor = true; 201 break; 202 case SENSOR_TYPE_WAKE_UP_GAME_ROTATION_VECTOR: 203 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GAME_ROTATION_VECTOR; 204 mWakeUpSensor = true; 205 break; 206 case SENSOR_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED: 207 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED; 208 mWakeUpSensor = true; 209 break; 210 case SENSOR_TYPE_WAKE_UP_STEP_DETECTOR: 211 mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_DETECTOR; 212 mWakeUpSensor = true; 213 break; 214 case SENSOR_TYPE_WAKE_UP_STEP_COUNTER: 215 mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_COUNTER; 216 mWakeUpSensor = true; 217 break; 218 case SENSOR_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR: 219 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR; 220 mWakeUpSensor = true; 221 break; 222 case SENSOR_TYPE_WAKE_UP_HEART_RATE: 223 mStringType = SENSOR_STRING_TYPE_WAKE_UP_HEART_RATE; 224 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 225 mWakeUpSensor = true; 226 break; 227 case SENSOR_TYPE_WAKE_GESTURE: 228 mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 229 mWakeUpSensor = true; 230 break; 231 default: 232 // Only pipe the stringType, requiredPermission and flags for custom sensors. 233 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) { 234 mStringType = hwSensor->stringType; 235 } 236 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) { 237 mRequiredPermission = hwSensor->requiredPermission; 238 } 239 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 240 mWakeUpSensor = hwSensor->flags & SENSOR_FLAG_WAKE_UP; 241 } 242 break; 243 } 244} 245 246Sensor::~Sensor() 247{ 248} 249 250const String8& Sensor::getName() const { 251 return mName; 252} 253 254const String8& Sensor::getVendor() const { 255 return mVendor; 256} 257 258int32_t Sensor::getHandle() const { 259 return mHandle; 260} 261 262int32_t Sensor::getType() const { 263 return mType; 264} 265 266float Sensor::getMinValue() const { 267 return mMinValue; 268} 269 270float Sensor::getMaxValue() const { 271 return mMaxValue; 272} 273 274float Sensor::getResolution() const { 275 return mResolution; 276} 277 278float Sensor::getPowerUsage() const { 279 return mPower; 280} 281 282int32_t Sensor::getMinDelay() const { 283 return mMinDelay; 284} 285 286nsecs_t Sensor::getMinDelayNs() const { 287 return getMinDelay() * 1000; 288} 289 290int32_t Sensor::getVersion() const { 291 return mVersion; 292} 293 294int32_t Sensor::getFifoReservedEventCount() const { 295 return mFifoReservedEventCount; 296} 297 298int32_t Sensor::getFifoMaxEventCount() const { 299 return mFifoMaxEventCount; 300} 301 302const String8& Sensor::getStringType() const { 303 return mStringType; 304} 305 306const String8& Sensor::getRequiredPermission() const { 307 return mRequiredPermission; 308} 309 310int32_t Sensor::getMaxDelay() const { 311 return mMaxDelay; 312} 313 314bool Sensor::isWakeUpSensor() const { 315 return mWakeUpSensor; 316} 317 318size_t Sensor::getFlattenedSize() const 319{ 320 size_t fixedSize = 321 sizeof(int32_t) * 3 + 322 sizeof(float) * 4 + 323 sizeof(int32_t) * 4 + 324 sizeof(bool) * 1; 325 326 size_t variableSize = 327 sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 328 sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 329 sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 330 sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 331 332 return fixedSize + variableSize; 333} 334 335status_t Sensor::flatten(void* buffer, size_t size) const { 336 if (size < getFlattenedSize()) { 337 return NO_MEMORY; 338 } 339 340 flattenString8(buffer, size, mName); 341 flattenString8(buffer, size, mVendor); 342 FlattenableUtils::write(buffer, size, mVersion); 343 FlattenableUtils::write(buffer, size, mHandle); 344 FlattenableUtils::write(buffer, size, mType); 345 FlattenableUtils::write(buffer, size, mMinValue); 346 FlattenableUtils::write(buffer, size, mMaxValue); 347 FlattenableUtils::write(buffer, size, mResolution); 348 FlattenableUtils::write(buffer, size, mPower); 349 FlattenableUtils::write(buffer, size, mMinDelay); 350 FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 351 FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 352 flattenString8(buffer, size, mStringType); 353 flattenString8(buffer, size, mRequiredPermission); 354 FlattenableUtils::write(buffer, size, mMaxDelay); 355 FlattenableUtils::write(buffer, size, mWakeUpSensor); 356 return NO_ERROR; 357} 358 359status_t Sensor::unflatten(void const* buffer, size_t size) { 360 if (!unflattenString8(buffer, size, mName)) { 361 return NO_MEMORY; 362 } 363 if (!unflattenString8(buffer, size, mVendor)) { 364 return NO_MEMORY; 365 } 366 367 size_t fixedSize = 368 sizeof(int32_t) * 3 + 369 sizeof(float) * 4 + 370 sizeof(int32_t) * 4 + 371 sizeof(bool) * 1; 372 if (size < fixedSize) { 373 return NO_MEMORY; 374 } 375 376 FlattenableUtils::read(buffer, size, mVersion); 377 FlattenableUtils::read(buffer, size, mHandle); 378 FlattenableUtils::read(buffer, size, mType); 379 FlattenableUtils::read(buffer, size, mMinValue); 380 FlattenableUtils::read(buffer, size, mMaxValue); 381 FlattenableUtils::read(buffer, size, mResolution); 382 FlattenableUtils::read(buffer, size, mPower); 383 FlattenableUtils::read(buffer, size, mMinDelay); 384 FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 385 FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 386 387 if (!unflattenString8(buffer, size, mStringType)) { 388 return NO_MEMORY; 389 } 390 if (!unflattenString8(buffer, size, mRequiredPermission)) { 391 return NO_MEMORY; 392 } 393 FlattenableUtils::read(buffer, size, mMaxDelay); 394 FlattenableUtils::read(buffer, size, mWakeUpSensor); 395 return NO_ERROR; 396} 397 398void Sensor::flattenString8(void*& buffer, size_t& size, 399 const String8& string8) { 400 uint32_t len = string8.length(); 401 FlattenableUtils::write(buffer, size, len); 402 memcpy(static_cast<char*>(buffer), string8.string(), len); 403 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 404} 405 406bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 407 uint32_t len; 408 if (size < sizeof(len)) { 409 return false; 410 } 411 FlattenableUtils::read(buffer, size, len); 412 if (size < len) { 413 return false; 414 } 415 outputString8.setTo(static_cast<char const*>(buffer), len); 416 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 417 return true; 418} 419 420// ---------------------------------------------------------------------------- 421}; // namespace android 422