Sensor.cpp revision 700180487ffec09d9df1657b018a7caadac24b75
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#include <stdint.h> 18589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h> 19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h> 21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/String8.h> 22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Flattenable.h> 23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <hardware/sensors.h> 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/Sensor.h> 27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 29589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 30589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::Sensor() 33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian : mHandle(0), mType(0), 34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mMinValue(0), mMaxValue(0), mResolution(0), 35724d91d778e71c8186399f4955de14b54812b3edAravind Akella mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0) 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 39724d91d778e71c8186399f4955de14b54812b3edAravind AkellaSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) 40a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian{ 41a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mName = hwSensor->name; 42a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mVendor = hwSensor->vendor; 432ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian mVersion = hwSensor->version; 44a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mHandle = hwSensor->handle; 45a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mType = hwSensor->type; 46a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMinValue = 0; // FIXME: minValue 47a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMaxValue = hwSensor->maxRange; // FIXME: maxValue 48a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mResolution = hwSensor->resolution; 49a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mPower = hwSensor->power; 50a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian mMinDelay = hwSensor->minDelay; 51700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 52724d91d778e71c8186399f4955de14b54812b3edAravind Akella // Set fifo event count zero for older devices which do not support batching. Fused 53724d91d778e71c8186399f4955de14b54812b3edAravind Akella // sensors also have their fifo counts set to zero. 54724d91d778e71c8186399f4955de14b54812b3edAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) { 55724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoReservedEventCount = hwSensor->fifoReservedEventCount; 56724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoMaxEventCount = hwSensor->fifoMaxEventCount; 57700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 58700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 59700180487ffec09d9df1657b018a7caadac24b75Aravind Akella // Ensure existing sensors have correct string type and required 60700180487ffec09d9df1657b018a7caadac24b75Aravind Akella // permissions. 61700180487ffec09d9df1657b018a7caadac24b75Aravind Akella switch (mType) { 62700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ACCELEROMETER: 63700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 64700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 65700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_AMBIENT_TEMPERATURE: 66700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 67700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 68700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GAME_ROTATION_VECTOR: 69700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 70700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 71700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 72700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 73700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 74700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GRAVITY: 75700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GRAVITY; 76700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 77700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE: 78700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 79700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 80700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 81700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 82700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 83700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_HEART_RATE: 84700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_HEART_RATE; 85700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 86700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 87700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LIGHT: 88700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LIGHT; 89700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 90700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_LINEAR_ACCELERATION: 91700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 92700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 93700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD: 94700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 95700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 96700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 97700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 98700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 99700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ORIENTATION: 100700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ORIENTATION; 101700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 102700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PRESSURE: 103700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PRESSURE; 104700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 105700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_PROXIMITY: 106700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_PROXIMITY; 107700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 108700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_RELATIVE_HUMIDITY: 109700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 110700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 111700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_ROTATION_VECTOR: 112700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 113700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 114700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_SIGNIFICANT_MOTION: 115700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 116700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 117700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_COUNTER: 118700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 119700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 120700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_STEP_DETECTOR: 121700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 122700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 123700180487ffec09d9df1657b018a7caadac24b75Aravind Akella case SENSOR_TYPE_TEMPERATURE: 124700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 125700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 126700180487ffec09d9df1657b018a7caadac24b75Aravind Akella default: 127700180487ffec09d9df1657b018a7caadac24b75Aravind Akella // Only pipe the stringType and requiredPermission for custom sensors. 128700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) { 129700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mStringType = hwSensor->stringType; 130700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 131700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) { 132700180487ffec09d9df1657b018a7caadac24b75Aravind Akella mRequiredPermission = hwSensor->requiredPermission; 133700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 134700180487ffec09d9df1657b018a7caadac24b75Aravind Akella break; 135724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 136a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 137a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 138589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor() 139589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 140589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 141589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 142589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 143589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 144589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 145589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 146589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 147589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 148589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 149589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 150589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 151589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 152589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 153589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 154589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 155589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 156589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 157589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 159589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 160589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 161589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 162589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 163589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 164589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 165589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 167589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 170589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 171589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 172589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 173589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 174a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 175a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 176a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 177a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 178b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 179b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 180b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 181b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 182b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 183b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 184b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 185b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 186724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoReservedEventCount() const { 187724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 188724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 189724d91d778e71c8186399f4955de14b54812b3edAravind Akella 190724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoMaxEventCount() const { 191724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 192724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 193724d91d778e71c8186399f4955de14b54812b3edAravind Akella 194700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getStringType() const { 195700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mStringType; 196700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 197700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 198700180487ffec09d9df1657b018a7caadac24b75Aravind Akellaconst String8& Sensor::getRequiredPermission() const { 199700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return mRequiredPermission; 200700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 201700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 202e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t Sensor::getFlattenedSize() const 203589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 204e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 2052ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian sizeof(int32_t) * 3 + 206a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian sizeof(float) * 4 + 207724d91d778e71c8186399f4955de14b54812b3edAravind Akella sizeof(int32_t) * 3; 208589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 209e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 210700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 211700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 212700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 213700180487ffec09d9df1657b018a7caadac24b75Aravind Akella sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 214589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 215e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 216589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 217589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 218e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 219e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 220e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 221e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 222589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 223700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mName); 224700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mVendor); 225e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 226e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 227e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 228e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 229e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 230e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 231e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 232e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 233724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 234724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 235700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mStringType); 236700180487ffec09d9df1657b018a7caadac24b75Aravind Akella flattenString8(buffer, size, mRequiredPermission); 237589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 238589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 239589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 240e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 241700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mName)) { 242e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 243e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 244700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mVendor)) { 245e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 246e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 247e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 248e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 249e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) * 3 + 250e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(float) * 4 + 251724d91d778e71c8186399f4955de14b54812b3edAravind Akella sizeof(int32_t) * 3; 252e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < fixedSize) { 253e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 254e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 255e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 256e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 257e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 258e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 259e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 260e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 261e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 262e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 263e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 264724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 265724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 266700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 267700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mStringType)) { 268700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 269700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 270700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (!unflattenString8(buffer, size, mRequiredPermission)) { 271700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return NO_MEMORY; 272700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 273589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 274589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 275589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 276700180487ffec09d9df1657b018a7caadac24b75Aravind Akellavoid Sensor::flattenString8(void*& buffer, size_t& size, 277700180487ffec09d9df1657b018a7caadac24b75Aravind Akella const String8& string8) { 278700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len = string8.length(); 279700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::write(buffer, size, len); 280700180487ffec09d9df1657b018a7caadac24b75Aravind Akella memcpy(static_cast<char*>(buffer), string8.string(), len); 281700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 282700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 283700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 284700180487ffec09d9df1657b018a7caadac24b75Aravind Akellabool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 285700180487ffec09d9df1657b018a7caadac24b75Aravind Akella uint32_t len; 286700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < sizeof(len)) { 287700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 288700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 289700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::read(buffer, size, len); 290700180487ffec09d9df1657b018a7caadac24b75Aravind Akella if (size < len) { 291700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return false; 292700180487ffec09d9df1657b018a7caadac24b75Aravind Akella } 293700180487ffec09d9df1657b018a7caadac24b75Aravind Akella outputString8.setTo(static_cast<char const*>(buffer), len); 294700180487ffec09d9df1657b018a7caadac24b75Aravind Akella FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 295700180487ffec09d9df1657b018a7caadac24b75Aravind Akella return true; 296700180487ffec09d9df1657b018a7caadac24b75Aravind Akella} 297700180487ffec09d9df1657b018a7caadac24b75Aravind Akella 298589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 299589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 300