Sensor.cpp revision adb65d9add2b7350b563d4583c5efbe3f0f0aca1
19189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima/* 29189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Copyright (C) 2010 The Android Open Source Project 39189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * 49189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Licensed under the Apache License, Version 2.0 (the "License"); 59189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * you may not use this file except in compliance with the License. 69189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * You may obtain a copy of the License at 79189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * 89189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * http://www.apache.org/licenses/LICENSE-2.0 99189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * 109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Unless required by applicable law or agreed to in writing, software 119189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * distributed under the License is distributed on an "AS IS" BASIS, 129189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * See the License for the specific language governing permissions and 149189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * limitations under the License. 159189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima */ 169189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 179189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <inttypes.h> 189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <stdint.h> 199189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <sys/types.h> 2064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <sys/limits.h> 21a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 2264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <utils/Errors.h> 2364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <utils/String8.h> 24e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn#include <utils/Flattenable.h> 25e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 269189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <hardware/sensors.h> 2764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 2864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <gui/Sensor.h> 2964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <log/log.h> 309189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 319189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima// ---------------------------------------------------------------------------- 329189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimanamespace android { 339189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima// ---------------------------------------------------------------------------- 349189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 359189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru OshimaSensor::Sensor() 369189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima : mHandle(0), mType(0), 37e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mMinValue(0), mMaxValue(0), mResolution(0), 389189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0), 395a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima mMaxDelay(0), mFlags(0) 405a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima{ 419189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima} 429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 43e2515eebf42c763c0a2d9f873a153711778cfc17Dianne HackbornSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) 44e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn{ 459189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mName = hwSensor->name; 46e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mVendor = hwSensor->vendor; 479189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mVersion = hwSensor->version; 489189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mHandle = hwSensor->handle; 49e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mType = hwSensor->type; 50e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mMinValue = 0; // FIXME: minValue 51e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mMaxValue = hwSensor->maxRange; // FIXME: maxValue 52e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mResolution = hwSensor->resolution; 539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mPower = hwSensor->power; 549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mMinDelay = hwSensor->minDelay; 5564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFlags = 0; 569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 57e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn // Set fifo event count zero for older devices which do not support batching. Fused 589189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima // sensors also have their fifo counts set to zero. 599189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) { 6064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFifoReservedEventCount = hwSensor->fifoReservedEventCount; 6164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFifoMaxEventCount = hwSensor->fifoMaxEventCount; 6264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } else { 6364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFifoReservedEventCount = 0; 6464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFifoMaxEventCount = 0; 6564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 660f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn 670f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 688ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn if (hwSensor->maxDelay > INT_MAX) { 690f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 700f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn // always fit in a 32 bit integer, log error and cap it to INT_MAX. 710f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 720f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn static_cast<int64_t>(hwSensor->maxDelay)); 738ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mMaxDelay = INT_MAX; 740f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else { 750f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mMaxDelay = (int32_t) hwSensor->maxDelay; 76e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 7714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn } else { 788ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn // For older hals set maxDelay to 0. 7964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mMaxDelay = 0; 8064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 812784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn 822784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn // Ensure existing sensors have correct string type, required permissions and reporting mode. 832784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn switch (mType) { 842784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn case SENSOR_TYPE_ACCELEROMETER: 852784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 8664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 879189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima break; 8864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima case SENSOR_TYPE_AMBIENT_TEMPERATURE: 89e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 90e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 9164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima break; 92e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima case SENSOR_TYPE_GAME_ROTATION_VECTOR: 9364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 9464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 95df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 96df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 97e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 98e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 992762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 1002762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_GRAVITY: 101df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_GRAVITY; 102df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 103df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 104df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_GYROSCOPE: 1052762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 1062762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 1072762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 108df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 1092762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 110df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 111df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 112e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn case SENSOR_TYPE_HEART_RATE: 1132762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_HEART_RATE; 1142762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 1152762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 1162762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 1172762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_LIGHT: 1182762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_LIGHT; 1192762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 1202762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 1212762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_LINEAR_ACCELERATION: 1222762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 1232762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 1242762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 1252762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_MAGNETIC_FIELD: 1262762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 1272762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 1282762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn break; 1292762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 1302762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 1318ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 132df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 1332762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn case SENSOR_TYPE_ORIENTATION: 1342762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn mStringType = SENSOR_STRING_TYPE_ORIENTATION; 135df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 13636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn break; 1375be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn case SENSOR_TYPE_PRESSURE: 138df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_PRESSURE; 139df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 140df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 141df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_PROXIMITY: 142e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mStringType = SENSOR_STRING_TYPE_PROXIMITY; 143df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 1448ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 1458ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_RELATIVE_HUMIDITY: 1468ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 1478ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 1488ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 1498ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_ROTATION_VECTOR: 1508ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 1518ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 1528ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 1538ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_SIGNIFICANT_MOTION: 1548ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 1558ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 1568ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 1578ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_STEP_COUNTER: 1588ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 1598ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 1608ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 1618ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_STEP_DETECTOR: 1628ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 1638ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 164df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 165df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_TEMPERATURE: 166df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 167df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 168df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 1698ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR: 170df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR; 171df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 172df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 173df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_ACCELEROMETER: 174df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_ACCELEROMETER; 1758ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 176e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn break; 177df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD: 178df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD; 179df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 180df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 1818ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_WAKE_UP_ORIENTATION: 1820f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_ORIENTATION; 183df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 184df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 185df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_GYROSCOPE: 1868ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE; 187df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 188df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 189df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_LIGHT: 190df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_LIGHT; 191df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 192df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 193df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_PRESSURE: 1948ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_PRESSURE; 195df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 196df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 1978ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_WAKE_UP_GRAVITY: 198df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_GRAVITY; 199df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 2008ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 2018ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_WAKE_UP_LINEAR_ACCELERATION: 202df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_LINEAR_ACCELERATION; 203df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 2048ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 205df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_ROTATION_VECTOR: 206df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_ROTATION_VECTOR; 207df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 2088ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 2098ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_WAKE_UP_RELATIVE_HUMIDITY: 210df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_RELATIVE_HUMIDITY; 211df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP); 2128ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 213df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_AMBIENT_TEMPERATURE: 214df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_AMBIENT_TEMPERATURE; 215df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 216df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 217df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED: 2188ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED; 2198ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 220df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 2218ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn case SENSOR_TYPE_WAKE_UP_GAME_ROTATION_VECTOR: 222e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_GAME_ROTATION_VECTOR; 22339ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 22439ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn break; 22539ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn case SENSOR_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED: 226df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED; 227e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 228df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 229df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_STEP_DETECTOR: 230df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_DETECTOR; 231df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP); 232df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 233df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_STEP_COUNTER: 234df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_COUNTER; 235df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 236df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn break; 237df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn case SENSOR_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR: 238df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR; 2399189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP); 240e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn break; 241e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn case SENSOR_TYPE_WAKE_UP_HEART_RATE: 2429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mStringType = SENSOR_STRING_TYPE_WAKE_UP_HEART_RATE; 2439189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 244e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 2452784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn break; 246569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima case SENSOR_TYPE_WAKE_UP_TILT_DETECTOR: 2472784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn mStringType = SENSOR_STRING_TYPE_WAKE_UP_TILT_DETECTOR; 248569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP); 249569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima break; 250569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima case SENSOR_TYPE_WAKE_GESTURE: 251569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 2529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 2538ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn break; 254569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima default: 255569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima // Only pipe the stringType, requiredPermission and flags for custom sensors. 2569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) { 2579189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima mStringType = hwSensor->stringType; 25864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 25964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) { 26064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mRequiredPermission = hwSensor->requiredPermission; 26164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 2628ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn 26364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 26464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mFlags = (int32_t) hwSensor->flags; 2651ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } else { 266e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 2671ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima // reporting mode of the sensor. 2681ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima if (mMinDelay > 0) { 2690f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2702f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn } else if (mMinDelay == 0) { 2710f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2720f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (mMinDelay < 0) { 2730f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2742f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn } 27564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 27664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima break; 27764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 278589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima} 27964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 28064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru OshimaSensor::~Sensor() 281589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima{ 282589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima} 28364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 28464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaconst String8& Sensor::getName() const { 28564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mName; 28664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 28764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 28864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaconst String8& Sensor::getVendor() const { 28964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mVendor; 29064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 29164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 29264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getHandle() const { 29364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mHandle; 2941ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima} 295fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 29664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getType() const { 2971ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima return mType; 29864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 29964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 30064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getMinValue() const { 30164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mMinValue; 30264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 3031ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 3041ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimafloat Sensor::getMaxValue() const { 30564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mMaxValue; 30664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 30764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 30864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getResolution() const { 30964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mResolution; 31064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 3111ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 31264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getPowerUsage() const { 31364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mPower; 31464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 31564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 31664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getMinDelay() const { 31764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mMinDelay; 3181ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima} 31964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 32064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimansecs_t Sensor::getMinDelayNs() const { 32164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return getMinDelay() * 1000; 32264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 32364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 32464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getVersion() const { 325b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed return mVersion; 326b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed} 327b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed 328b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedint32_t Sensor::getFifoReservedEventCount() const { 329b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed return mFifoReservedEventCount; 330b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed} 331b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed 332b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedint32_t Sensor::getFifoMaxEventCount() const { 333b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed return mFifoMaxEventCount; 334b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed} 335b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed 336b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedconst String8& Sensor::getStringType() const { 337b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed return mStringType; 338b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed} 339b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed 340b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedconst String8& Sensor::getRequiredPermission() const { 341b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed return mRequiredPermission; 342b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed} 343b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed 3441ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaint32_t Sensor::getMaxDelay() const { 34564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mMaxDelay; 34664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 34764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 34864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getFlags() const { 34964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mFlags; 35064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 3511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 35264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimabool Sensor::isWakeUpSensor() const { 35364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return mFlags & SENSOR_FLAG_WAKE_UP; 35464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 35564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 35664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getReportingMode() const { 35764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 35864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 3591ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 36064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimasize_t Sensor::getFlattenedSize() const 36164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima{ 36264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima size_t fixedSize = 36364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(int32_t) * 3 + 36464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(float) * 4 + 36564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(int32_t) * 5; 3661ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 36764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima size_t variableSize = 36864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 36964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 37064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 37164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 37264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 3731ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima return fixedSize + variableSize; 37464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 37564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 37664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimastatus_t Sensor::flatten(void* buffer, size_t size) const { 377a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (size < getFlattenedSize()) { 378a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate return NO_MEMORY; 379a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 380a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 381a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate flattenString8(buffer, size, mName); 382a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate flattenString8(buffer, size, mVendor); 383a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate FlattenableUtils::write(buffer, size, mVersion); 384a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate FlattenableUtils::write(buffer, size, mHandle); 385a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate FlattenableUtils::write(buffer, size, mType); 386a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate FlattenableUtils::write(buffer, size, mMinValue); 387a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate FlattenableUtils::write(buffer, size, mMaxValue); 38864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mResolution); 38964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mPower); 39064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mMinDelay); 39164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 3921ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 39364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima flattenString8(buffer, size, mStringType); 39464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima flattenString8(buffer, size, mRequiredPermission); 39564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mMaxDelay); 39664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima FlattenableUtils::write(buffer, size, mFlags); 39764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return NO_ERROR; 39864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima} 39964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 40064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimastatus_t Sensor::unflatten(void const* buffer, size_t size) { 40164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (!unflattenString8(buffer, size, mName)) { 40264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return NO_MEMORY; 40364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 40464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (!unflattenString8(buffer, size, mVendor)) { 40564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima return NO_MEMORY; 40664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 40764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 408fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown size_t fixedSize = 40964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima sizeof(int32_t) * 3 + 410fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown sizeof(float) * 4 + 4111ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima sizeof(int32_t) * 5; 4121ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima if (size < fixedSize) { 4131ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima return NO_MEMORY; 4141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } 4151ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 416fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mVersion); 417fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mHandle); 418fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mType); 419fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mMinValue); 420fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mMaxValue); 421fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mResolution); 422fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mPower); 423fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mMinDelay); 424fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 425fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 426fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 4271ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima if (!unflattenString8(buffer, size, mStringType)) { 4281ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima return NO_MEMORY; 429e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 430e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (!unflattenString8(buffer, size, mRequiredPermission)) { 431e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return NO_MEMORY; 432e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 4332f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn FlattenableUtils::read(buffer, size, mMaxDelay); 4345be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn FlattenableUtils::read(buffer, size, mFlags); 4352b31d53161789358de57fd396716a6503855c5daDianne Hackborn return NO_ERROR; 4362b31d53161789358de57fd396716a6503855c5daDianne Hackborn} 437e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 438e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornvoid Sensor::flattenString8(void*& buffer, size_t& size, 439e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn const String8& string8) { 440e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn uint32_t len = string8.length(); 4412b31d53161789358de57fd396716a6503855c5daDianne Hackborn FlattenableUtils::write(buffer, size, len); 442908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn memcpy(static_cast<char*>(buffer), string8.string(), len); 4432b31d53161789358de57fd396716a6503855c5daDianne Hackborn FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 4442b31d53161789358de57fd396716a6503855c5daDianne Hackborn} 4452b31d53161789358de57fd396716a6503855c5daDianne Hackborn 446e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornbool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 447e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn uint32_t len; 448e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (size < sizeof(len)) { 449e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return false; 450e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 451908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn FlattenableUtils::read(buffer, size, len); 452e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (size < len) { 453e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return false; 454e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 455e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn outputString8.setTo(static_cast<char const*>(buffer), len); 456e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 457e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return true; 458e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn} 4595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 4605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn// ---------------------------------------------------------------------------- 4615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn}; // namespace android 462e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn