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