1589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian/* 2589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Copyright (C) 2010 The Android Open Source Project 3589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 4589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * you may not use this file except in compliance with the License. 6589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * You may obtain a copy of the License at 7589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 8589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 10589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Unless required by applicable law or agreed to in writing, software 11589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * See the License for the specific language governing permissions and 14589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * limitations under the License. 15589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian */ 16589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 17589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 18b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav#include <binder/AppOpsManager.h> 19b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav#include <binder/IServiceManager.h> 20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/Sensor.h> 216a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <hardware/sensors.h> 22d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella#include <log/log.h> 236a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <utils/Errors.h> 246a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <utils/String8.h> 256a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <utils/Flattenable.h> 266a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 276a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <inttypes.h> 286a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <stdint.h> 296a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <sys/types.h> 306a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <sys/limits.h> 31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 366a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(const char * name) : 376a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName(name), mHandle(0), mType(0), 386a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMinValue(0), mMaxValue(0), mResolution(0), 396a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mPower(0), mMinDelay(0), mVersion(0), mFifoReservedEventCount(0), 406a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoMaxEventCount(0), mRequiredAppOp(0), 416a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMaxDelay(0), mFlags(0) { 42589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 43589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 446a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) : 456a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu Sensor(*hwSensor, uuid_t(), halVersion) { 466a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} 476a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 486a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersion) { 496a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName = hwSensor.name; 506a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mVendor = hwSensor.vendor; 516a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mVersion = hwSensor.version; 526a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mHandle = hwSensor.handle; 536a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mType = hwSensor.type; 54a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMinValue = 0; // FIXME: minValue 556a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMaxValue = hwSensor.maxRange; // FIXME: maxValue 566a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mResolution = hwSensor.resolution; 576a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mPower = hwSensor.power; 586a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMinDelay = hwSensor.minDelay; 590e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags = 0; 606a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mUuid = uuid; 61700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 62724d91d778e71c8186399f4955de14b54812b3edAravind Akella // Set fifo event count zero for older devices which do not support batching. Fused 63724d91d778e71c8186399f4955de14b54812b3edAravind Akella // sensors also have their fifo counts set to zero. 648493b79e1cff92450076ca7450c4bf4e434a6816Aravind Akella if (halVersion > SENSORS_DEVICE_API_VERSION_1_0) { 656a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoReservedEventCount = hwSensor.fifoReservedEventCount; 666a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoMaxEventCount = hwSensor.fifoMaxEventCount; 67d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella } else { 68d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoReservedEventCount = 0; 69d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoMaxEventCount = 0; 70700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 71700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 72d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 736a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (hwSensor.maxDelay > INT_MAX) { 74d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 75d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // always fit in a 32 bit integer, log error and cap it to INT_MAX. 768f515ce1c57379cafac4357bc4fdb61dd346ec5fMark Salyzyn ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 776a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu static_cast<int64_t>(hwSensor.maxDelay)); 78d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = INT_MAX; 79d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 806a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMaxDelay = static_cast<int32_t>(hwSensor.maxDelay); 81d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 82d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 83d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // For older hals set maxDelay to 0. 84d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = 0; 85d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 86d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 870e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // Ensure existing sensors have correct string type, required permissions and reporting mode. 8864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity 8964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older 9064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors. 9164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // All the OEM defined defined sensors have flags set to whatever is provided by the HAL. 92700180487ffec09d9df1657b018a7caadac24b75Aravind Akella switch (mType) { 93700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ACCELEROMETER: 94700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 950e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 96700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 97700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_AMBIENT_TEMPERATURE: 98700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 990e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 100700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 101700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GAME_ROTATION_VECTOR: 102700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 1030e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 104700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 105700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 106700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 1070e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 108700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 109700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GRAVITY: 110700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GRAVITY; 1110e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 112700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 113700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE: 114700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 1150e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 116700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 117700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 118700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 1190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 120700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 121b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav case SENSOR_TYPE_HEART_RATE: { 122700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_HEART_RATE; 123700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 124b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav AppOpsManager appOps; 125b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 1260e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 127b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } break; 128700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LIGHT: 129700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LIGHT; 1300e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 131700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 132700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LINEAR_ACCELERATION: 133700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 1340e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 135700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 136700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD: 137700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 1380e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 139700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 140700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 141700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 1420e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 143700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 144700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ORIENTATION: 145700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ORIENTATION; 1460e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 147700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 148700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PRESSURE: 149700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PRESSURE; 1500e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 151700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 152700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PROXIMITY: 153700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PROXIMITY; 15464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 15564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 15664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 15764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 158700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 159700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_RELATIVE_HUMIDITY: 160700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 1610e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 162700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 163700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ROTATION_VECTOR: 164700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 1650e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 166700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 167700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_SIGNIFICANT_MOTION: 168700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 16964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 17064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 17164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 17264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 173700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 174700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_COUNTER: 175700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 1760e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 177700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 178700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_DETECTOR: 179700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 1800e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 181700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 182700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_TEMPERATURE: 183700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 1840e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 185700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 18664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella case SENSOR_TYPE_TILT_DETECTOR: 18764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mStringType = SENSOR_STRING_TYPE_TILT_DETECTOR; 18864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 18964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 19064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 19164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 1922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu break; 193e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand case SENSOR_TYPE_WAKE_GESTURE: 194e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 19564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 19664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 19764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 19864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 199e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand break; 20031d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown case SENSOR_TYPE_GLANCE_GESTURE: 20131d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown mStringType = SENSOR_STRING_TYPE_GLANCE_GESTURE; 20264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 20364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 20464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 20564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 20631d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown break; 207fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella case SENSOR_TYPE_PICK_UP_GESTURE: 208fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella mStringType = SENSOR_STRING_TYPE_PICK_UP_GESTURE; 20964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 21064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 21164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 21264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 213fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella break; 2149bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro case SENSOR_TYPE_WRIST_TILT_GESTURE: 2159bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mStringType = SENSOR_STRING_TYPE_WRIST_TILT_GESTURE; 2169bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 2179bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 2189bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mFlags |= SENSOR_FLAG_WAKE_UP; 2199bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro } 2209bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro break; 2212576cb63b3fe1592f54816625036566b9eb0793aPeng Xu case SENSOR_TYPE_DYNAMIC_SENSOR_META: 2222576cb63b3fe1592f54816625036566b9eb0793aPeng Xu mStringType = SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META; 2232576cb63b3fe1592f54816625036566b9eb0793aPeng Xu mFlags = SENSOR_FLAG_SPECIAL_REPORTING_MODE; // special trigger and non-wake up 2242576cb63b3fe1592f54816625036566b9eb0793aPeng Xu break; 2251b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi case SENSOR_TYPE_POSE_6DOF: 2261b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mStringType = SENSOR_STRING_TYPE_POSE_6DOF; 2271b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2281b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi break; 2291b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi case SENSOR_TYPE_STATIONARY_DETECT: 2301b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mStringType = SENSOR_STRING_TYPE_STATIONARY_DETECT; 2311b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2321b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 2331b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_WAKE_UP; 2341b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi } 2351b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi break; 2361b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi case SENSOR_TYPE_MOTION_DETECT: 2371b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mStringType = SENSOR_STRING_TYPE_MOTION_DETECT; 2381b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2391b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 2401b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_WAKE_UP; 2411b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi } 2421b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi break; 2431b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi case SENSOR_TYPE_HEART_BEAT: 2441b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mStringType = SENSOR_STRING_TYPE_HEART_BEAT; 2451b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 2461b4566c4172244a5ac23a2de7ee53f43000b45bfAshutosh Joshi break; 247700180487ffec09d9df1657b018a7caadac24b75Aravind Akella default: 2489a844cf78f09953145200b4074d47589257a408cAravind Akella // Only pipe the stringType, requiredPermission and flags for custom sensors. 2496a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.stringType) { 2506a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mStringType = hwSensor.stringType; 251700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 2526a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.requiredPermission) { 2536a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mRequiredPermission = hwSensor.requiredPermission; 254e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani if (!strcmp(mRequiredPermission, SENSOR_PERMISSION_BODY_SENSORS)) { 255e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani AppOpsManager appOps; 256e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 257e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani } 258700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 2590e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 2609a844cf78f09953145200b4074d47589257a408cAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2616a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags = static_cast<uint32_t>(hwSensor.flags); 2620e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else { 2630e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 2640e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // reporting mode of the sensor. 2650e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella if (mMinDelay > 0) { 2660e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2670e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay == 0) { 2680e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2690e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay < 0) { 2700e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2710e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } 2729a844cf78f09953145200b4074d47589257a408cAravind Akella } 273700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 274724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 27564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella 276755c451c7861a029e26e5f16e319b629169e656dPeng Xu if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2776a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Wake-up flag of HAL 1.3 and above is set here 2786a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags |= (hwSensor.flags & SENSOR_FLAG_WAKE_UP); 2796a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 2806a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Log error if the reporting mode is not as expected, but respect HAL setting. 2816a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu int actualReportingMode = (hwSensor.flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 2826a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 2836a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (actualReportingMode != expectedReportingMode) { 2846a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu ALOGE("Reporting Mode incorrect: sensor %s handle=%#010" PRIx32 " type=%" PRId32 " " 2856a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu "actual=%d expected=%d", 2866a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName.string(), mHandle, mType, actualReportingMode, expectedReportingMode); 2876a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu } 288755c451c7861a029e26e5f16e319b629169e656dPeng Xu } 289755c451c7861a029e26e5f16e319b629169e656dPeng Xu 2906a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Feature flags 2916a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Set DYNAMIC_SENSOR_MASK and ADDITIONAL_INFO_MASK flag here. Compatible with HAL 1_3. 2926a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2936a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags |= (hwSensor.flags & (DYNAMIC_SENSOR_MASK | ADDITIONAL_INFO_MASK)); 2946a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu } 295f9b7f8548eb95f2c387c4c2331acfaa04b6099b8Aravind Akella // Set DATA_INJECTION flag here. Defined in HAL 1_4. 296f9b7f8548eb95f2c387c4c2331acfaa04b6099b8Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_4) { 2976a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags |= (hwSensor.flags & DATA_INJECTION_MASK); 29864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 299b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 300b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav if (mRequiredPermission.length() > 0) { 301b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav // If the sensor is protected by a permission we need to know if it is 302b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav // a runtime one to determine whether we can use the permission cache. 303b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 304b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav if (binder != 0) { 305b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav sp<IPermissionController> permCtrl = interface_cast<IPermissionController>(binder); 306b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mRequiredPermissionRuntime = permCtrl->isRuntimePermission( 307b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav String16(mRequiredPermission)); 308b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } 309b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } 310a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 311a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 3126a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::~Sensor() { 313589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 314589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 315589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 316589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 317589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 318589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 319589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 320589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 321589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 322589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 323589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 324589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 325589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 326589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 327589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 328589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 329589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 330589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 331589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 332589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 333589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 334589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 335589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 336589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 337589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 338589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 339589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 340589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 341589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 342589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 343589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 344589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 345589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 346589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 347a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 348a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 349a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 350a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 351b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 352b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 353b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 354b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 355b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 356b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 357b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 358b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 359d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFifoReservedEventCount() const { 360724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 361724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 362724d91d778e71c8186399f4955de14b54812b3edAravind Akella 363d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFifoMaxEventCount() const { 364724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 365724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 366724d91d778e71c8186399f4955de14b54812b3edAravind Akella 367700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getStringType() const { 368700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mStringType; 369700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 370700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 371700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getRequiredPermission() const { 372700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mRequiredPermission; 373700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 374700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 375b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslavbool Sensor::isRequiredPermissionRuntime() const { 376b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return mRequiredPermissionRuntime; 377b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav} 378b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 379b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslavint32_t Sensor::getRequiredAppOp() const { 380b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return mRequiredAppOp; 381b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav} 382b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 383d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akellaint32_t Sensor::getMaxDelay() const { 384d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella return mMaxDelay; 385d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella} 386d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 387d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFlags() const { 3880e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags; 3890e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 3900e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 3919a844cf78f09953145200b4074d47589257a408cAravind Akellabool Sensor::isWakeUpSensor() const { 3926a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_WAKE_UP) != 0; 3930e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 3940e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 3950cc8f809924706c7d683da30605f432635dd5bb6Peng Xubool Sensor::isDynamicSensor() const { 3966a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_DYNAMIC_SENSOR) != 0; 3976a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} 3986a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 3996a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xubool Sensor::hasAdditionalInfo() const { 4006a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_ADDITIONAL_INFO) != 0; 4010cc8f809924706c7d683da30605f432635dd5bb6Peng Xu} 4020cc8f809924706c7d683da30605f432635dd5bb6Peng Xu 4030e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getReportingMode() const { 4040e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 4059a844cf78f09953145200b4074d47589257a408cAravind Akella} 4069a844cf78f09953145200b4074d47589257a408cAravind Akella 4072576cb63b3fe1592f54816625036566b9eb0793aPeng Xuconst Sensor::uuid_t& Sensor::getUuid() const { 4082576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return mUuid; 4092576cb63b3fe1592f54816625036566b9eb0793aPeng Xu} 4102576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 41153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiservoid Sensor::setId(int32_t id) { 41253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser mUuid.i64[0] = id; 41353ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser mUuid.i64[1] = 0; 41453ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser} 41553ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 41653ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiserint32_t Sensor::getId() const { 41753ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser return int32_t(mUuid.i64[0]); 41853ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser} 41953ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 4206a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xusize_t Sensor::getFlattenedSize() const { 421e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 4222576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + 4232576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mMinValue) + sizeof(mMaxValue) + sizeof(mResolution) + 4242576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mPower) + sizeof(mMinDelay) + sizeof(mFifoMaxEventCount) + 4252576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFifoMaxEventCount) + sizeof(mRequiredPermissionRuntime) + 4262576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + sizeof(mFlags) + sizeof(mUuid); 427589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 428e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 429700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 430700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 431700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 432700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 433589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 434e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 435589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 436589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 437e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 438e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 439e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 440e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 441589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 442700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mName); 443700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mVendor); 444e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 445e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 446e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 447e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 448e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 449e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 450e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 451e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 452724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 453724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 454700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mStringType); 455700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mRequiredPermission); 456b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::write(buffer, size, mRequiredPermissionRuntime); 457b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::write(buffer, size, mRequiredAppOp); 458d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::write(buffer, size, mMaxDelay); 4590e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::write(buffer, size, mFlags); 46053ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser if (mUuid.i64[1] != 0) { 46153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // We should never hit this case with our current API, but we 46253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // could via a careless API change. If that happens, 46353ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // this code will keep us from leaking our UUID (while probably 46453ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // breaking dynamic sensors). See b/29547335. 46553ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser ALOGW("Sensor with UUID being flattened; sending 0. Expect " 46653ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser "bad dynamic sensor behavior"); 46753ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser uuid_t tmpUuid; // default constructor makes this 0. 46853ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser FlattenableUtils::write(buffer, size, tmpUuid); 46953ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser } else { 47053ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser FlattenableUtils::write(buffer, size, mUuid); 47153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser } 472589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 473589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 474589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 475e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 476700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mName)) { 477e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 478e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 479700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mVendor)) { 480e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 481e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 482e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 4832576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t fixedSize1 = 4842576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + sizeof(mMinValue) + 4852576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mMaxValue) + sizeof(mResolution) + sizeof(mPower) + sizeof(mMinDelay) + 4862576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFifoMaxEventCount) + sizeof(mFifoMaxEventCount); 4872576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (size < fixedSize1) { 488e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 489e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 490e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 491e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 492e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 493e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 494e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 495e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 496e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 497e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 498e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 499724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 500724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 501700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 502700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mStringType)) { 503700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 504700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 505700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mRequiredPermission)) { 506700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 507700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 5082576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 5092576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t fixedSize2 = 5102576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mRequiredPermissionRuntime) + sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + 5112576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFlags) + sizeof(mUuid); 5122576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (size < fixedSize2) { 5132576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return NO_MEMORY; 5142576cb63b3fe1592f54816625036566b9eb0793aPeng Xu } 5152576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 516b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::read(buffer, size, mRequiredPermissionRuntime); 517b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::read(buffer, size, mRequiredAppOp); 518d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::read(buffer, size, mMaxDelay); 5190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::read(buffer, size, mFlags); 5202576cb63b3fe1592f54816625036566b9eb0793aPeng Xu FlattenableUtils::read(buffer, size, mUuid); 521589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 522589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 523589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 524700180487ffec09d9df1657b018a7caadac24b75Aravind Akellavoid Sensor::flattenString8(void*& buffer, size_t& size, 525700180487ffec09d9df1657b018a7caadac24b75Aravind Akella const String8& string8) { 526d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t len = static_cast<uint32_t>(string8.length()); 527700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::write(buffer, size, len); 528700180487ffec09d9df1657b018a7caadac24b75Aravind Akella memcpy(static_cast<char*>(buffer), string8.string(), len); 529700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 530700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 531700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 532700180487ffec09d9df1657b018a7caadac24b75Aravind Akellabool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 533700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len; 534700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < sizeof(len)) { 535700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 536700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 537700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::read(buffer, size, len); 538700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < len) { 539700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 540700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 541700180487ffec09d9df1657b018a7caadac24b75Aravind Akella outputString8.setTo(static_cast<char const*>(buffer), len); 542700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 543700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return true; 544700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 545700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 546589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 547589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 548