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 17801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/Sensor.h> 18801ea093b0e923a61b832f2adba698a273479880Mathias Agopian 19a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <inttypes.h> 20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 21b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav#include <binder/AppOpsManager.h> 22801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <binder/IPermissionController.h> 23b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav#include <binder/IServiceManager.h> 246a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 296a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(const char * name) : 306a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName(name), mHandle(0), mType(0), 316a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMinValue(0), mMaxValue(0), mResolution(0), 326a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mPower(0), mMinDelay(0), mVersion(0), mFifoReservedEventCount(0), 336a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoMaxEventCount(0), mRequiredAppOp(0), 346a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMaxDelay(0), mFlags(0) { 35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 376a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) : 386a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu Sensor(*hwSensor, uuid_t(), halVersion) { 396a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} 406a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 416a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersion) { 426a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName = hwSensor.name; 436a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mVendor = hwSensor.vendor; 446a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mVersion = hwSensor.version; 456a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mHandle = hwSensor.handle; 466a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mType = hwSensor.type; 47a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMinValue = 0; // FIXME: minValue 48801ea093b0e923a61b832f2adba698a273479880Mathias Agopian mMaxValue = hwSensor.maxRange; // FIXME: maxValue 496a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mResolution = hwSensor.resolution; 506a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mPower = hwSensor.power; 516a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMinDelay = hwSensor.minDelay; 520e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags = 0; 536a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mUuid = uuid; 54700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 55724d91d778e71c8186399f4955de14b54812b3edAravind Akella // Set fifo event count zero for older devices which do not support batching. Fused 56724d91d778e71c8186399f4955de14b54812b3edAravind Akella // sensors also have their fifo counts set to zero. 578493b79e1cff92450076ca7450c4bf4e434a6816Aravind Akella if (halVersion > SENSORS_DEVICE_API_VERSION_1_0) { 586a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoReservedEventCount = hwSensor.fifoReservedEventCount; 596a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFifoMaxEventCount = hwSensor.fifoMaxEventCount; 60d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella } else { 61d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoReservedEventCount = 0; 62d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoMaxEventCount = 0; 63700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 64700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 65d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 666a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (hwSensor.maxDelay > INT_MAX) { 67d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 68d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // always fit in a 32 bit integer, log error and cap it to INT_MAX. 698f515ce1c57379cafac4357bc4fdb61dd346ec5fMark Salyzyn ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 706a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu static_cast<int64_t>(hwSensor.maxDelay)); 71d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = INT_MAX; 72d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 736a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mMaxDelay = static_cast<int32_t>(hwSensor.maxDelay); 74d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 75d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 76d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // For older hals set maxDelay to 0. 77d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = 0; 78d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 79d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 800e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // Ensure existing sensors have correct string type, required permissions and reporting mode. 8164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity 8264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older 8364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors. 8464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // All the OEM defined defined sensors have flags set to whatever is provided by the HAL. 85700180487ffec09d9df1657b018a7caadac24b75Aravind Akella switch (mType) { 86700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ACCELEROMETER: 87700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 880e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 89700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 90700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_AMBIENT_TEMPERATURE: 91700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 920e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 93700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 94700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GAME_ROTATION_VECTOR: 95700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 960e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 97700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 98700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 99700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 1000e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 101700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 102700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GRAVITY: 103700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GRAVITY; 1040e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 105700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 106700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE: 107700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 1080e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 109700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 110700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 111700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 1120e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 113700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 114b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav case SENSOR_TYPE_HEART_RATE: { 115700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_HEART_RATE; 116700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 117b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav AppOpsManager appOps; 118b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 1190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 120b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } break; 121700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LIGHT: 122700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LIGHT; 1230e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 124700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 125700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LINEAR_ACCELERATION: 126700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 1270e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 128700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 129700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD: 130700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 1310e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 132700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 133700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 134700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 1350e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 136700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 137700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ORIENTATION: 138700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ORIENTATION; 1390e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 140700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 141700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PRESSURE: 142700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PRESSURE; 1430e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 144700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 145700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PROXIMITY: 146700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PROXIMITY; 14764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 14864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 14964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 15064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 151700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 152700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_RELATIVE_HUMIDITY: 153700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 1540e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 155700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 156700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ROTATION_VECTOR: 157700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 1580e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 159700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 160700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_SIGNIFICANT_MOTION: 161700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 16264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 16364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 16464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 16564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 166700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 167700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_COUNTER: 168700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 1690e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 170700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 171700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_DETECTOR: 172700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 1730e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 174700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 175700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_TEMPERATURE: 176700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 1770e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 178700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 17964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella case SENSOR_TYPE_TILT_DETECTOR: 18064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mStringType = SENSOR_STRING_TYPE_TILT_DETECTOR; 18164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 18264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 18364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 18464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 1852576cb63b3fe1592f54816625036566b9eb0793aPeng Xu break; 186e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand case SENSOR_TYPE_WAKE_GESTURE: 187e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 18864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 18964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 19064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= SENSOR_FLAG_WAKE_UP; 19164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 192e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand break; 19331d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown case SENSOR_TYPE_GLANCE_GESTURE: 19431d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown mStringType = SENSOR_STRING_TYPE_GLANCE_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 } 19931d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown break; 200fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella case SENSOR_TYPE_PICK_UP_GESTURE: 201fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella mStringType = SENSOR_STRING_TYPE_PICK_UP_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 } 206fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella break; 2072e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro case SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT: 2082e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro mStringType = SENSOR_STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT; 2092e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2102e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro break; 2119bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro case SENSOR_TYPE_WRIST_TILT_GESTURE: 2129bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mStringType = SENSOR_STRING_TYPE_WRIST_TILT_GESTURE; 2139bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 2149bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 2159bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro mFlags |= SENSOR_FLAG_WAKE_UP; 2169bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro } 2179bb99b1570a1715cce1d02a776c06f1596d61ecdNick Vaccaro break; 2182576cb63b3fe1592f54816625036566b9eb0793aPeng Xu case SENSOR_TYPE_DYNAMIC_SENSOR_META: 2192576cb63b3fe1592f54816625036566b9eb0793aPeng Xu mStringType = SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META; 2204e44cf52e025991bc575140e923c7d2e4ead62b9Peng Xu mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; // special trigger 2214e44cf52e025991bc575140e923c7d2e4ead62b9Peng Xu if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 2224e44cf52e025991bc575140e923c7d2e4ead62b9Peng Xu mFlags |= SENSOR_FLAG_WAKE_UP; 2234e44cf52e025991bc575140e923c7d2e4ead62b9Peng Xu } 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; 247ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi 248ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi // TODO: Placeholder for LLOB sensor type 249ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi 250ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi 251ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi case SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: 252ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi mStringType = SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED; 253ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 254ab4e1ffdaa062ab369b125be0cf518a3054e6328Ashutosh Joshi break; 255700180487ffec09d9df1657b018a7caadac24b75Aravind Akella default: 2569a844cf78f09953145200b4074d47589257a408cAravind Akella // Only pipe the stringType, requiredPermission and flags for custom sensors. 2576a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.stringType) { 2586a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mStringType = hwSensor.stringType; 259700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 2606a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.requiredPermission) { 2616a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mRequiredPermission = hwSensor.requiredPermission; 262e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani if (!strcmp(mRequiredPermission, SENSOR_PERMISSION_BODY_SENSORS)) { 263e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani AppOpsManager appOps; 264e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 265e35c7d65bb3c226fe3c5fc5e3933f64f0963eaebPrashant Malani } 266700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 2670e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 2689a844cf78f09953145200b4074d47589257a408cAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2696a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags = static_cast<uint32_t>(hwSensor.flags); 2700e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else { 2710e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 2720e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // reporting mode of the sensor. 2730e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella if (mMinDelay > 0) { 2740e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2750e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay == 0) { 2760e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2770e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay < 0) { 2780e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2790e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } 2809a844cf78f09953145200b4074d47589257a408cAravind Akella } 281700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 282724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 28364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella 284755c451c7861a029e26e5f16e319b629169e656dPeng Xu if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2856a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Wake-up flag of HAL 1.3 and above is set here 2866a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags |= (hwSensor.flags & SENSOR_FLAG_WAKE_UP); 2876a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 2886a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Log error if the reporting mode is not as expected, but respect HAL setting. 2896a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu int actualReportingMode = (hwSensor.flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 2906a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 2916a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (actualReportingMode != expectedReportingMode) { 2926a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu ALOGE("Reporting Mode incorrect: sensor %s handle=%#010" PRIx32 " type=%" PRId32 " " 2936a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu "actual=%d expected=%d", 2946a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mName.string(), mHandle, mType, actualReportingMode, expectedReportingMode); 2956a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu } 296755c451c7861a029e26e5f16e319b629169e656dPeng Xu } 297755c451c7861a029e26e5f16e319b629169e656dPeng Xu 2986a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Feature flags 2996a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Set DYNAMIC_SENSOR_MASK and ADDITIONAL_INFO_MASK flag here. Compatible with HAL 1_3. 3006a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 301e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mFlags |= hwSensor.flags & (DYNAMIC_SENSOR_MASK | ADDITIONAL_INFO_MASK); 302e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 303e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // Set DIRECT_REPORT_MASK and DIRECT_CHANNEL_MASK flags. Compatible with HAL 1_3. 304e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 305e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // only on continuous sensors direct report mode is defined 306e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if ((mFlags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) { 307e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mFlags |= hwSensor.flags 308e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu & (SENSOR_FLAG_MASK_DIRECT_REPORT | SENSOR_FLAG_MASK_DIRECT_CHANNEL); 309e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 3106a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu } 311f9b7f8548eb95f2c387c4c2331acfaa04b6099b8Aravind Akella // Set DATA_INJECTION flag here. Defined in HAL 1_4. 312f9b7f8548eb95f2c387c4c2331acfaa04b6099b8Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_4) { 3136a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mFlags |= (hwSensor.flags & DATA_INJECTION_MASK); 31464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 315b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 316b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav if (mRequiredPermission.length() > 0) { 317b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav // If the sensor is protected by a permission we need to know if it is 318b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav // a runtime one to determine whether we can use the permission cache. 319b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 320b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav if (binder != 0) { 321b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav sp<IPermissionController> permCtrl = interface_cast<IPermissionController>(binder); 322b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mRequiredPermissionRuntime = permCtrl->isRuntimePermission( 323b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav String16(mRequiredPermission)); 324b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } 325b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } 326a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 327a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 3286a2d3a06caa337857cf60cfc70a9a78909ad3608Peng XuSensor::~Sensor() { 329589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 330589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 331589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 332589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 333589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 334589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 335589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 336589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 337589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 338589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 339589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 340589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 341589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 342589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 343589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 344589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 345589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 346589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 347589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 348589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 349589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 350589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 351589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 352589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 353589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 354589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 355589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 356589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 357589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 358589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 359589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 360589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 361589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 362589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 363a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 364a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 365a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 366a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 367b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 368b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 369b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 370b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 371b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 372b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 373b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 374b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 375d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFifoReservedEventCount() const { 376724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 377724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 378724d91d778e71c8186399f4955de14b54812b3edAravind Akella 379d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFifoMaxEventCount() const { 380724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 381724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 382724d91d778e71c8186399f4955de14b54812b3edAravind Akella 383700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getStringType() const { 384700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mStringType; 385700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 386700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 387700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getRequiredPermission() const { 388700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mRequiredPermission; 389700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 390700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 391b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslavbool Sensor::isRequiredPermissionRuntime() const { 392b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return mRequiredPermissionRuntime; 393b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav} 394b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 395b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslavint32_t Sensor::getRequiredAppOp() const { 396b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return mRequiredAppOp; 397b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav} 398b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 399d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akellaint32_t Sensor::getMaxDelay() const { 400d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella return mMaxDelay; 401d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella} 402d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 403d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozauint32_t Sensor::getFlags() const { 4040e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags; 4050e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 4060e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 4079a844cf78f09953145200b4074d47589257a408cAravind Akellabool Sensor::isWakeUpSensor() const { 4086a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_WAKE_UP) != 0; 4090e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 4100e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 4110cc8f809924706c7d683da30605f432635dd5bb6Peng Xubool Sensor::isDynamicSensor() const { 4126a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_DYNAMIC_SENSOR) != 0; 4136a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} 4146a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 4156a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xubool Sensor::hasAdditionalInfo() const { 4166a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu return (mFlags & SENSOR_FLAG_ADDITIONAL_INFO) != 0; 4170cc8f809924706c7d683da30605f432635dd5bb6Peng Xu} 4180cc8f809924706c7d683da30605f432635dd5bb6Peng Xu 419e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint32_t Sensor::getHighestDirectReportRateLevel() const { 420e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return ((mFlags & SENSOR_FLAG_MASK_DIRECT_REPORT) >> SENSOR_FLAG_SHIFT_DIRECT_REPORT); 421e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 422e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 423e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xubool Sensor::isDirectChannelTypeSupported(int32_t sharedMemType) const { 424e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu switch (sharedMemType) { 425e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu case SENSOR_DIRECT_MEM_TYPE_ASHMEM: 426e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return mFlags & SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM; 427e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu case SENSOR_DIRECT_MEM_TYPE_GRALLOC: 428e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return mFlags & SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC; 429e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu default: 430e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return false; 431e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 432e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 433e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 4340e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getReportingMode() const { 4350e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 4369a844cf78f09953145200b4074d47589257a408cAravind Akella} 4379a844cf78f09953145200b4074d47589257a408cAravind Akella 4382576cb63b3fe1592f54816625036566b9eb0793aPeng Xuconst Sensor::uuid_t& Sensor::getUuid() const { 4392576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return mUuid; 4402576cb63b3fe1592f54816625036566b9eb0793aPeng Xu} 4412576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 44253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiservoid Sensor::setId(int32_t id) { 44353ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser mUuid.i64[0] = id; 44453ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser mUuid.i64[1] = 0; 44553ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser} 44653ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 44753ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiserint32_t Sensor::getId() const { 44853ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser return int32_t(mUuid.i64[0]); 44953ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser} 45053ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 4516a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xusize_t Sensor::getFlattenedSize() const { 452e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 4532576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + 4542576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mMinValue) + sizeof(mMaxValue) + sizeof(mResolution) + 4552576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mPower) + sizeof(mMinDelay) + sizeof(mFifoMaxEventCount) + 4562576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFifoMaxEventCount) + sizeof(mRequiredPermissionRuntime) + 4572576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + sizeof(mFlags) + sizeof(mUuid); 458589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 459e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 460700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 461700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 462700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 463700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 464589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 465e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 466589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 467589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 468e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 469e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 470e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 471e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 472589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 473700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mName); 474700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mVendor); 475e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 476e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 477e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 478e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 479e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 480e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 481e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 482e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 483724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 484724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 485700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mStringType); 486700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mRequiredPermission); 487b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::write(buffer, size, mRequiredPermissionRuntime); 488b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::write(buffer, size, mRequiredAppOp); 489d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::write(buffer, size, mMaxDelay); 4900e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::write(buffer, size, mFlags); 49153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser if (mUuid.i64[1] != 0) { 49253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // We should never hit this case with our current API, but we 49353ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // could via a careless API change. If that happens, 49453ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // this code will keep us from leaking our UUID (while probably 49553ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // breaking dynamic sensors). See b/29547335. 49653ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser ALOGW("Sensor with UUID being flattened; sending 0. Expect " 49753ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser "bad dynamic sensor behavior"); 49853ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser uuid_t tmpUuid; // default constructor makes this 0. 49953ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser FlattenableUtils::write(buffer, size, tmpUuid); 50053ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser } else { 50153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser FlattenableUtils::write(buffer, size, mUuid); 50253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser } 503589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 504589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 505589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 506e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 507700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mName)) { 508e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 509e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 510700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mVendor)) { 511e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 512e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 513e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 5142576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t fixedSize1 = 5152576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + sizeof(mMinValue) + 5162576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mMaxValue) + sizeof(mResolution) + sizeof(mPower) + sizeof(mMinDelay) + 5172576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFifoMaxEventCount) + sizeof(mFifoMaxEventCount); 5182576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (size < fixedSize1) { 519e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 520e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 521e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 522e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 523e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 524e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 525e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 526e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 527e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 528e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 529e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 530724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 531724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 532700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 533700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mStringType)) { 534700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 535700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 536700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mRequiredPermission)) { 537700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 538700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 5392576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 5402576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t fixedSize2 = 5412576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mRequiredPermissionRuntime) + sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + 5422576cb63b3fe1592f54816625036566b9eb0793aPeng Xu sizeof(mFlags) + sizeof(mUuid); 5432576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (size < fixedSize2) { 5442576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return NO_MEMORY; 5452576cb63b3fe1592f54816625036566b9eb0793aPeng Xu } 5462576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 547b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::read(buffer, size, mRequiredPermissionRuntime); 548b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav FlattenableUtils::read(buffer, size, mRequiredAppOp); 549d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::read(buffer, size, mMaxDelay); 5500e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::read(buffer, size, mFlags); 5512576cb63b3fe1592f54816625036566b9eb0793aPeng Xu FlattenableUtils::read(buffer, size, mUuid); 552589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 553589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 554589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 555700180487ffec09d9df1657b018a7caadac24b75Aravind Akellavoid Sensor::flattenString8(void*& buffer, size_t& size, 556700180487ffec09d9df1657b018a7caadac24b75Aravind Akella const String8& string8) { 557d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t len = static_cast<uint32_t>(string8.length()); 558700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::write(buffer, size, len); 559700180487ffec09d9df1657b018a7caadac24b75Aravind Akella memcpy(static_cast<char*>(buffer), string8.string(), len); 560700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 561700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 562700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 563700180487ffec09d9df1657b018a7caadac24b75Aravind Akellabool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 564700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len; 565700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < sizeof(len)) { 566700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 567700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 568700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::read(buffer, size, len); 569700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < len) { 570700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 571700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 572700180487ffec09d9df1657b018a7caadac24b75Aravind Akella outputString8.setTo(static_cast<char const*>(buffer), len); 573700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 574700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return true; 575700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 576700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 577589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 578589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 579