Sensor.cpp revision fd8498c41e8904e3636e47cf81466d439aed46a8
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 178f515ce1c57379cafac4357bc4fdb61dd346ec5fMark Salyzyn#include <inttypes.h> 18589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h> 19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h> 20d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella#include <sys/limits.h> 21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h> 23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/String8.h> 24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Flattenable.h> 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <hardware/sensors.h> 27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/Sensor.h> 29d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella#include <log/log.h> 30589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::Sensor() 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian : mHandle(0), mType(0), 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mMinValue(0), mMaxValue(0), mResolution(0), 389a844cf78f09953145200b4074d47589257a408cAravind Akella mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0), 390e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mMaxDelay(0), mFlags(0) 40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 41589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 42589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 43724d91d778e71c8186399f4955de14b54812b3edAravind AkellaSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) 44a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian{ 45a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mName = hwSensor->name; 46a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mVendor = hwSensor->vendor; 472ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian mVersion = hwSensor->version; 48a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mHandle = hwSensor->handle; 49a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mType = hwSensor->type; 50a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMinValue = 0; // FIXME: minValue 51a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMaxValue = hwSensor->maxRange; // FIXME: maxValue 52a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mResolution = hwSensor->resolution; 53a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mPower = hwSensor->power; 54a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian mMinDelay = hwSensor->minDelay; 550e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags = 0; 56700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 57724d91d778e71c8186399f4955de14b54812b3edAravind Akella // Set fifo event count zero for older devices which do not support batching. Fused 58724d91d778e71c8186399f4955de14b54812b3edAravind Akella // sensors also have their fifo counts set to zero. 59724d91d778e71c8186399f4955de14b54812b3edAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) { 60724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoReservedEventCount = hwSensor->fifoReservedEventCount; 61724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoMaxEventCount = hwSensor->fifoMaxEventCount; 62d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella } else { 63d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoReservedEventCount = 0; 64d35e3af04d4b7e850a3b87b2211d1a3993f9b76fAravind Akella mFifoMaxEventCount = 0; 65700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 66700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 67d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 68d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella if (hwSensor->maxDelay > INT_MAX) { 69d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 70d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // always fit in a 32 bit integer, log error and cap it to INT_MAX. 718f515ce1c57379cafac4357bc4fdb61dd346ec5fMark Salyzyn ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 728f515ce1c57379cafac4357bc4fdb61dd346ec5fMark Salyzyn static_cast<int64_t>(hwSensor->maxDelay)); 73d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = INT_MAX; 74d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 75d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = (int32_t) hwSensor->maxDelay; 76d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 77d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } else { 78d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella // For older hals set maxDelay to 0. 79d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella mMaxDelay = 0; 80d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella } 81d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 820e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // Ensure existing sensors have correct string type, required permissions and reporting mode. 83700180487ffec09d9df1657b018a7caadac24b75Aravind Akella switch (mType) { 84700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ACCELEROMETER: 85700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 860e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 87700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 88700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_AMBIENT_TEMPERATURE: 89700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 900e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 91700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 92700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GAME_ROTATION_VECTOR: 93700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 940e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 95700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 96700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 97700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 980e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 99700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 100700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GRAVITY: 101700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GRAVITY; 1020e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 103700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 104700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE: 105700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 1060e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 107700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 108700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 109700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 1100e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 111700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 112700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_HEART_RATE: 113700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_HEART_RATE; 114700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 1150e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 116700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 117700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LIGHT: 118700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LIGHT; 1190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 120700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 121700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LINEAR_ACCELERATION: 122700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 1230e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 124700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 125700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD: 126700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 1270e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 128700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 129700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 130700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 1310e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 132700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 133700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ORIENTATION: 134700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ORIENTATION; 1350e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 136700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 137700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PRESSURE: 138700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PRESSURE; 1390e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 140700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 141700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PROXIMITY: 142700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PROXIMITY; 1430e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP); 144700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 145700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_RELATIVE_HUMIDITY: 146700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 1470e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 148700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 149700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ROTATION_VECTOR: 150700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 1510e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 152700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 153700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_SIGNIFICANT_MOTION: 154700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 1550e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 156700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 157700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_COUNTER: 158700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 1590e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 160700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 161700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_DETECTOR: 162700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 1630e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 164700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 165700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_TEMPERATURE: 166700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 1670e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 168700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 1690e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella case SENSOR_TYPE_WAKE_UP_TILT_DETECTOR: 1700e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mStringType = SENSOR_STRING_TYPE_WAKE_UP_TILT_DETECTOR; 1710e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP); 1729a844cf78f09953145200b4074d47589257a408cAravind Akella break; 173e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand case SENSOR_TYPE_WAKE_GESTURE: 174e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 1750e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 176e284a90f5027aed767ff10a31640a9cd9b974838Etienne Le Grand break; 17731d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown case SENSOR_TYPE_GLANCE_GESTURE: 17831d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown mStringType = SENSOR_STRING_TYPE_GLANCE_GESTURE; 17931d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 18031d825d7edcaac7254f310d3cf85af9fc1927c25Jeff Brown break; 181fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella case SENSOR_TYPE_PICK_UP_GESTURE: 182fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella mStringType = SENSOR_STRING_TYPE_PICK_UP_GESTURE; 183fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP); 184fd8498c41e8904e3636e47cf81466d439aed46a8Aravind Akella break; 185700180487ffec09d9df1657b018a7caadac24b75Aravind Akella default: 1869a844cf78f09953145200b4074d47589257a408cAravind Akella // Only pipe the stringType, requiredPermission and flags for custom sensors. 187700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) { 188700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = hwSensor->stringType; 189700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 190700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) { 191700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = hwSensor->requiredPermission; 192700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 1930e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 1949a844cf78f09953145200b4074d47589257a408cAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 1950e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags = (int32_t) hwSensor->flags; 1960e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else { 1970e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 1980e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // reporting mode of the sensor. 1990e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella if (mMinDelay > 0) { 2000e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2010e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay == 0) { 2020e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2030e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay < 0) { 2040e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2050e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } 2069a844cf78f09953145200b4074d47589257a408cAravind Akella } 207700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 208724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 209a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 210a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 211589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor() 212589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 213589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 214589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 215589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 216589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 217589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 218589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 219589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 220589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 221589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 222589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 223589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 224589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 225589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 226589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 227589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 228589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 229589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 230589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 231589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 232589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 233589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 234589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 235589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 236589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 237589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 238589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 239589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 240589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 241589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 242589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 243589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 244589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 245589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 246589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 247a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 248a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 249a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 250a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 251b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 252b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 253b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 254b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 255b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 256b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 257b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 258b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 259724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoReservedEventCount() const { 260724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 261724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 262724d91d778e71c8186399f4955de14b54812b3edAravind Akella 263724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoMaxEventCount() const { 264724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 265724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 266724d91d778e71c8186399f4955de14b54812b3edAravind Akella 267700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getStringType() const { 268700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mStringType; 269700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 270700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 271700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getRequiredPermission() const { 272700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mRequiredPermission; 273700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 274700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 275d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akellaint32_t Sensor::getMaxDelay() const { 276d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella return mMaxDelay; 277d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella} 278d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 2790e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getFlags() const { 2800e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags; 2810e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 2820e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 2839a844cf78f09953145200b4074d47589257a408cAravind Akellabool Sensor::isWakeUpSensor() const { 2840e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags & SENSOR_FLAG_WAKE_UP; 2850e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 2860e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 2870e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getReportingMode() const { 2880e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 2899a844cf78f09953145200b4074d47589257a408cAravind Akella} 2909a844cf78f09953145200b4074d47589257a408cAravind Akella 291e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t Sensor::getFlattenedSize() const 292589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 293e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 2942ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian sizeof(int32_t) * 3 + 295a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian sizeof(float) * 4 + 2960e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella sizeof(int32_t) * 5; 297589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 298e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 299700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 300700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 301700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 302700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 303589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 304e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 305589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 306589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 307e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 308e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 309e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 310e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 311589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 312700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mName); 313700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mVendor); 314e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 315e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 316e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 317e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 318e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 319e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 320e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 321e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 322724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 323724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 324700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mStringType); 325700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mRequiredPermission); 326d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::write(buffer, size, mMaxDelay); 3270e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::write(buffer, size, mFlags); 328589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 329589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 330589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 331e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 332700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mName)) { 333e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 334e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 335700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mVendor)) { 336e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 337e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 338e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 339e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 340e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) * 3 + 341e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(float) * 4 + 3420e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella sizeof(int32_t) * 5; 343e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < fixedSize) { 344e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 345e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 346e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 347e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 348e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 349e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 350e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 351e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 352e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 353e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 354e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 355724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 356724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 357700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 358700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mStringType)) { 359700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 360700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 361700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mRequiredPermission)) { 362700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 363700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 364d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::read(buffer, size, mMaxDelay); 3650e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::read(buffer, size, mFlags); 366589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 367589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 368589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 369700180487ffec09d9df1657b018a7caadac24b75Aravind Akellavoid Sensor::flattenString8(void*& buffer, size_t& size, 370700180487ffec09d9df1657b018a7caadac24b75Aravind Akella const String8& string8) { 371700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len = string8.length(); 372700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::write(buffer, size, len); 373700180487ffec09d9df1657b018a7caadac24b75Aravind Akella memcpy(static_cast<char*>(buffer), string8.string(), len); 374700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 375700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 376700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 377700180487ffec09d9df1657b018a7caadac24b75Aravind Akellabool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 378700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len; 379700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < sizeof(len)) { 380700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 381700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 382700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::read(buffer, size, len); 383700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < len) { 384700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 385700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 386700180487ffec09d9df1657b018a7caadac24b75Aravind Akella outputString8.setTo(static_cast<char const*>(buffer), len); 387700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 388700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return true; 389700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 390700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 391589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 392589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 393