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