Sensor.cpp revision 64ffcb0944db2cc523374f550fe1535dfe3eedd6
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. 8364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity 8464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older 8564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors. 8664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // All the OEM defined defined sensors have flags set to whatever is provided by the HAL. 87700180487ffec09d9df1657b018a7caadac24b75Aravind Akella switch (mType) { 88700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ACCELEROMETER: 89700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 900e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 91700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 92700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_AMBIENT_TEMPERATURE: 93700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 940e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 95700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 96700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GAME_ROTATION_VECTOR: 97700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 980e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 99700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 100700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 101700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 1020e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 103700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 104700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GRAVITY: 105700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GRAVITY; 1060e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 107700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 108700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE: 109700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 1100e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 111700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 112700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 113700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 1140e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 115700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 116700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_HEART_RATE: 117700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_HEART_RATE; 118700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 1190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 120700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 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 } 18564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella 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; 207700180487ffec09d9df1657b018a7caadac24b75Aravind Akella default: 2089a844cf78f09953145200b4074d47589257a408cAravind Akella // Only pipe the stringType, requiredPermission and flags for custom sensors. 209700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) { 210700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = hwSensor->stringType; 211700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 212700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) { 213700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = hwSensor->requiredPermission; 214700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 2150e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 2169a844cf78f09953145200b4074d47589257a408cAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 2170e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags = (int32_t) hwSensor->flags; 2180e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else { 2190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 2200e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella // reporting mode of the sensor. 2210e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella if (mMinDelay > 0) { 2220e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 2230e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay == 0) { 2240e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 2250e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } else if (mMinDelay < 0) { 2260e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 2270e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella } 2289a844cf78f09953145200b4074d47589257a408cAravind Akella } 229700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 230724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 23164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella 23264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // For the newer HALs log errors if reporting mask flags are set incorrectly. 23364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 23464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella // Wake-up flag is set here. 23564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mFlags |= (hwSensor->flags & SENSOR_FLAG_WAKE_UP); 23664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (mFlags != hwSensor->flags) { 23764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella int actualReportingMode = 23864ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella (hwSensor->flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 23964ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 24064ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella if (actualReportingMode != expectedReportingMode) { 24164ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella ALOGE("Reporting Mode incorrect: sensor %s handle=%d type=%d " 24264ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella "actual=%d expected=%d", 24364ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella mName.string(), mHandle, mType, actualReportingMode, expectedReportingMode); 24464ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 24564ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella 24664ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 24764ffcb0944db2cc523374f550fe1535dfe3eedd6Aravind Akella } 248a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 249a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 250589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor() 251589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 252589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 253589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 254589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 255589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 256589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 257589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 258589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 259589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 260589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 261589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 262589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 263589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 264589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 265589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 266589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 267589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 268589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 269589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 270589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 271589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 272589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 273589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 274589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 275589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 276589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 277589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 278589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 279589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 280589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 281589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 282589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 283589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 284589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 285589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 286a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 287a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 288a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 289a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 290b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 291b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 292b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 293b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 294b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 295b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 296b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 297b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 298724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoReservedEventCount() const { 299724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 300724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 301724d91d778e71c8186399f4955de14b54812b3edAravind Akella 302724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoMaxEventCount() const { 303724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 304724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 305724d91d778e71c8186399f4955de14b54812b3edAravind Akella 306700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getStringType() const { 307700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mStringType; 308700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 309700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 310700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getRequiredPermission() const { 311700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mRequiredPermission; 312700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 313700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 314d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akellaint32_t Sensor::getMaxDelay() const { 315d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella return mMaxDelay; 316d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella} 317d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella 3180e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getFlags() const { 3190e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags; 3200e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 3210e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 3229a844cf78f09953145200b4074d47589257a408cAravind Akellabool Sensor::isWakeUpSensor() const { 3230e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return mFlags & SENSOR_FLAG_WAKE_UP; 3240e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella} 3250e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella 3260e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akellaint32_t Sensor::getReportingMode() const { 3270e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 3289a844cf78f09953145200b4074d47589257a408cAravind Akella} 3299a844cf78f09953145200b4074d47589257a408cAravind Akella 330e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t Sensor::getFlattenedSize() const 331589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 332e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 3332ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian sizeof(int32_t) * 3 + 334a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian sizeof(float) * 4 + 3350e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella sizeof(int32_t) * 5; 336589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 337e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 338700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 339700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 340700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 341700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 342589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 343e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 344589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 345589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 346e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 347e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 348e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 349e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 350589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 351700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mName); 352700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mVendor); 353e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 354e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 355e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 356e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 357e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 358e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 359e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 360e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 361724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 362724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 363700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mStringType); 364700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mRequiredPermission); 365d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::write(buffer, size, mMaxDelay); 3660e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::write(buffer, size, mFlags); 367589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 368589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 369589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 370e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 371700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mName)) { 372e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 373e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 374700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mVendor)) { 375e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 376e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 377e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 378e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 379e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) * 3 + 380e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(float) * 4 + 3810e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella sizeof(int32_t) * 5; 382e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < fixedSize) { 383e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 384e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 385e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 386e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 387e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 388e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 389e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 390e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 391e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 392e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 393e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 394724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 395724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 396700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 397700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mStringType)) { 398700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 399700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 400700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mRequiredPermission)) { 401700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 402700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 403d9441e4c27bb7d0b1dfe2a8b5c1ee1714442648dAravind Akella FlattenableUtils::read(buffer, size, mMaxDelay); 4040e025c5af365e45e02cb75c1d46b46c7f4cd44cbAravind Akella FlattenableUtils::read(buffer, size, mFlags); 405589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 406589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 407589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 408700180487ffec09d9df1657b018a7caadac24b75Aravind Akellavoid Sensor::flattenString8(void*& buffer, size_t& size, 409700180487ffec09d9df1657b018a7caadac24b75Aravind Akella const String8& string8) { 410700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len = string8.length(); 411700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::write(buffer, size, len); 412700180487ffec09d9df1657b018a7caadac24b75Aravind Akella memcpy(static_cast<char*>(buffer), string8.string(), len); 413700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 414700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 415700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 416700180487ffec09d9df1657b018a7caadac24b75Aravind Akellabool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 417700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len; 418700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < sizeof(len)) { 419700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 420700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 421700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::read(buffer, size, len); 422700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < len) { 423700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 424700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 425700180487ffec09d9df1657b018a7caadac24b75Aravind Akella outputString8.setTo(static_cast<char const*>(buffer), len); 426700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 427700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return true; 428700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 429700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 430589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 431589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 432