Sensor.cpp revision d35e3af04d4b7e850a3b87b2211d1a3993f9b76f
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
21#include <utils/String8.h>
22#include <utils/Flattenable.h>
23
24#include <hardware/sensors.h>
25
26#include <gui/Sensor.h>
27
28// ----------------------------------------------------------------------------
29namespace android {
30// ----------------------------------------------------------------------------
31
32Sensor::Sensor()
33    : mHandle(0), mType(0),
34      mMinValue(0), mMaxValue(0), mResolution(0),
35      mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0)
36{
37}
38
39Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion)
40{
41    mName = hwSensor->name;
42    mVendor = hwSensor->vendor;
43    mVersion = hwSensor->version;
44    mHandle = hwSensor->handle;
45    mType = hwSensor->type;
46    mMinValue = 0;                      // FIXME: minValue
47    mMaxValue = hwSensor->maxRange;     // FIXME: maxValue
48    mResolution = hwSensor->resolution;
49    mPower = hwSensor->power;
50    mMinDelay = hwSensor->minDelay;
51
52    // Set fifo event count zero for older devices which do not support batching. Fused
53    // sensors also have their fifo counts set to zero.
54    if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) {
55        mFifoReservedEventCount = hwSensor->fifoReservedEventCount;
56        mFifoMaxEventCount = hwSensor->fifoMaxEventCount;
57    } else {
58        mFifoReservedEventCount = 0;
59        mFifoMaxEventCount = 0;
60    }
61
62    // Ensure existing sensors have correct string type and required
63    // permissions.
64    switch (mType) {
65    case SENSOR_TYPE_ACCELEROMETER:
66        mStringType = SENSOR_STRING_TYPE_ACCELEROMETER;
67        break;
68    case SENSOR_TYPE_AMBIENT_TEMPERATURE:
69        mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE;
70        break;
71    case SENSOR_TYPE_GAME_ROTATION_VECTOR:
72        mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR;
73        break;
74    case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
75        mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
76        break;
77    case SENSOR_TYPE_GRAVITY:
78        mStringType = SENSOR_STRING_TYPE_GRAVITY;
79        break;
80    case SENSOR_TYPE_GYROSCOPE:
81        mStringType = SENSOR_STRING_TYPE_GYROSCOPE;
82        break;
83    case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
84        mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED;
85        break;
86    case SENSOR_TYPE_HEART_RATE:
87        mStringType = SENSOR_STRING_TYPE_HEART_RATE;
88        mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
89        break;
90    case SENSOR_TYPE_LIGHT:
91        mStringType = SENSOR_STRING_TYPE_LIGHT;
92        break;
93    case SENSOR_TYPE_LINEAR_ACCELERATION:
94        mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION;
95        break;
96    case SENSOR_TYPE_MAGNETIC_FIELD:
97        mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD;
98        break;
99    case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
100        mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
101        break;
102    case SENSOR_TYPE_ORIENTATION:
103        mStringType = SENSOR_STRING_TYPE_ORIENTATION;
104        break;
105    case SENSOR_TYPE_PRESSURE:
106        mStringType = SENSOR_STRING_TYPE_PRESSURE;
107        break;
108    case SENSOR_TYPE_PROXIMITY:
109        mStringType = SENSOR_STRING_TYPE_PROXIMITY;
110        break;
111    case SENSOR_TYPE_RELATIVE_HUMIDITY:
112        mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY;
113        break;
114    case SENSOR_TYPE_ROTATION_VECTOR:
115        mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR;
116        break;
117    case SENSOR_TYPE_SIGNIFICANT_MOTION:
118        mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION;
119        break;
120    case SENSOR_TYPE_STEP_COUNTER:
121        mStringType = SENSOR_STRING_TYPE_STEP_COUNTER;
122        break;
123    case SENSOR_TYPE_STEP_DETECTOR:
124        mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR;
125        break;
126    case SENSOR_TYPE_TEMPERATURE:
127        mStringType = SENSOR_STRING_TYPE_TEMPERATURE;
128        break;
129    default:
130        // Only pipe the stringType and requiredPermission for custom sensors.
131        if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) {
132            mStringType = hwSensor->stringType;
133        }
134        if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) {
135            mRequiredPermission = hwSensor->requiredPermission;
136        }
137        break;
138    }
139}
140
141Sensor::~Sensor()
142{
143}
144
145const String8& Sensor::getName() const {
146    return mName;
147}
148
149const String8& Sensor::getVendor() const {
150    return mVendor;
151}
152
153int32_t Sensor::getHandle() const {
154    return mHandle;
155}
156
157int32_t Sensor::getType() const {
158    return mType;
159}
160
161float Sensor::getMinValue() const {
162    return mMinValue;
163}
164
165float Sensor::getMaxValue() const {
166    return mMaxValue;
167}
168
169float Sensor::getResolution() const {
170    return mResolution;
171}
172
173float Sensor::getPowerUsage() const {
174    return mPower;
175}
176
177int32_t Sensor::getMinDelay() const {
178    return mMinDelay;
179}
180
181nsecs_t Sensor::getMinDelayNs() const {
182    return getMinDelay() * 1000;
183}
184
185int32_t Sensor::getVersion() const {
186    return mVersion;
187}
188
189int32_t Sensor::getFifoReservedEventCount() const {
190    return mFifoReservedEventCount;
191}
192
193int32_t Sensor::getFifoMaxEventCount() const {
194    return mFifoMaxEventCount;
195}
196
197const String8& Sensor::getStringType() const {
198    return mStringType;
199}
200
201const String8& Sensor::getRequiredPermission() const {
202    return mRequiredPermission;
203}
204
205size_t Sensor::getFlattenedSize() const
206{
207    size_t fixedSize =
208            sizeof(int32_t) * 3 +
209            sizeof(float) * 4 +
210            sizeof(int32_t) * 3;
211
212    size_t variableSize =
213            sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) +
214            sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) +
215            sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) +
216            sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length());
217
218    return fixedSize + variableSize;
219}
220
221status_t Sensor::flatten(void* buffer, size_t size) const {
222    if (size < getFlattenedSize()) {
223        return NO_MEMORY;
224    }
225
226    flattenString8(buffer, size, mName);
227    flattenString8(buffer, size, mVendor);
228    FlattenableUtils::write(buffer, size, mVersion);
229    FlattenableUtils::write(buffer, size, mHandle);
230    FlattenableUtils::write(buffer, size, mType);
231    FlattenableUtils::write(buffer, size, mMinValue);
232    FlattenableUtils::write(buffer, size, mMaxValue);
233    FlattenableUtils::write(buffer, size, mResolution);
234    FlattenableUtils::write(buffer, size, mPower);
235    FlattenableUtils::write(buffer, size, mMinDelay);
236    FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
237    FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
238    flattenString8(buffer, size, mStringType);
239    flattenString8(buffer, size, mRequiredPermission);
240    return NO_ERROR;
241}
242
243status_t Sensor::unflatten(void const* buffer, size_t size) {
244    if (!unflattenString8(buffer, size, mName)) {
245        return NO_MEMORY;
246    }
247    if (!unflattenString8(buffer, size, mVendor)) {
248        return NO_MEMORY;
249    }
250
251    size_t fixedSize =
252            sizeof(int32_t) * 3 +
253            sizeof(float) * 4 +
254            sizeof(int32_t) * 3;
255    if (size < fixedSize) {
256        return NO_MEMORY;
257    }
258
259    FlattenableUtils::read(buffer, size, mVersion);
260    FlattenableUtils::read(buffer, size, mHandle);
261    FlattenableUtils::read(buffer, size, mType);
262    FlattenableUtils::read(buffer, size, mMinValue);
263    FlattenableUtils::read(buffer, size, mMaxValue);
264    FlattenableUtils::read(buffer, size, mResolution);
265    FlattenableUtils::read(buffer, size, mPower);
266    FlattenableUtils::read(buffer, size, mMinDelay);
267    FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
268    FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
269
270    if (!unflattenString8(buffer, size, mStringType)) {
271        return NO_MEMORY;
272    }
273    if (!unflattenString8(buffer, size, mRequiredPermission)) {
274        return NO_MEMORY;
275    }
276    return NO_ERROR;
277}
278
279void Sensor::flattenString8(void*& buffer, size_t& size,
280        const String8& string8) {
281    uint32_t len = string8.length();
282    FlattenableUtils::write(buffer, size, len);
283    memcpy(static_cast<char*>(buffer), string8.string(), len);
284    FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
285}
286
287bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) {
288    uint32_t len;
289    if (size < sizeof(len)) {
290        return false;
291    }
292    FlattenableUtils::read(buffer, size, len);
293    if (size < len) {
294        return false;
295    }
296    outputString8.setTo(static_cast<char const*>(buffer), len);
297    FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
298    return true;
299}
300
301// ----------------------------------------------------------------------------
302}; // namespace android
303