Sensor.cpp revision 8683fca395d01734ec7946e9f0595ec5d7b754c6
1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 2010 The Android Open Source Project
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions and
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * limitations under the License.
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <stdint.h>
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <sys/types.h>
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <utils/Errors.h>
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <utils/String8.h>
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <utils/Flattenable.h>
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <hardware/sensors.h>
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include <gui/Sensor.h>
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber// ----------------------------------------------------------------------------
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubernamespace android {
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber// ----------------------------------------------------------------------------
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberSensor::Sensor()
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    : mHandle(0), mType(0),
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber      mMinValue(0), mMaxValue(0), mResolution(0),
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber      mPower(0), mMinDelay(0)
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberSensor::Sensor(struct sensor_t const* hwSensor)
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mName = hwSensor->name;
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mVendor = hwSensor->vendor;
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mVersion = hwSensor->version;
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mHandle = hwSensor->handle;
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mType = hwSensor->type;
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mMinValue = 0;                      // FIXME: minValue
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mMaxValue = hwSensor->maxRange;     // FIXME: maxValue
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mResolution = hwSensor->resolution;
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mPower = hwSensor->power;
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mMinDelay = hwSensor->minDelay;
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberSensor::~Sensor()
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst String8& Sensor::getName() const {
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mName;
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst String8& Sensor::getVendor() const {
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mVendor;
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32_t Sensor::getHandle() const {
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mHandle;
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32_t Sensor::getType() const {
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mType;
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberfloat Sensor::getMinValue() const {
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mMinValue;
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberfloat Sensor::getMaxValue() const {
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mMaxValue;
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberfloat Sensor::getResolution() const {
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mResolution;
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberfloat Sensor::getPowerUsage() const {
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mPower;
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32_t Sensor::getMinDelay() const {
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mMinDelay;
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubernsecs_t Sensor::getMinDelayNs() const {
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return getMinDelay() * 1000;
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32_t Sensor::getVersion() const {
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return mVersion;
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t Sensor::getSize() const
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return  sizeof(int32_t) + ((mName.length() + 3) & ~3) +
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sizeof(int32_t) + ((mVendor.length() + 3) & ~3) +
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sizeof(int32_t) * 3 +
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sizeof(float) * 4 +
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sizeof(int32_t);
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t write(void* buffer, size_t offset, const String8& value) {
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    memcpy(static_cast<char*>(buffer) + offset, value.string(), value.length());
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (value.length() + 3) & ~3;
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t write(void* buffer, size_t offset, float value) {
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *reinterpret_cast<float*>(static_cast<char*>(buffer) + offset) = value;
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return sizeof(float);
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t write(void* buffer, size_t offset, int32_t value) {
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *reinterpret_cast<int32_t*>(static_cast<char*>(buffer) + offset) = value;
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return sizeof(int32_t);
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatus_t Sensor::flatten(void* buffer) const
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    size_t offset = 0;
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, int32_t(mName.length()));
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mName);
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, int32_t(mVendor.length()));
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mVendor);
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mVersion);
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mHandle);
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mType);
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mMinValue);
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mMaxValue);
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mResolution);
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mPower);
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += write(buffer, offset, mMinDelay);
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return NO_ERROR;
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t read(void const* buffer, size_t offset, String8* value, int32_t len) {
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    value->setTo(static_cast<char const*>(buffer) + offset, len);
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return (len + 3) & ~3;
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t read(void const* buffer, size_t offset, float* value) {
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *value = *reinterpret_cast<float const*>(static_cast<char const*>(buffer) + offset);
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return sizeof(float);
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatic inline
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubersize_t read(void const* buffer, size_t offset, int32_t* value) {
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *value = *reinterpret_cast<int32_t const*>(static_cast<char const*>(buffer) + offset);
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return sizeof(int32_t);
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberstatus_t Sensor::unflatten(void const* buffer, size_t size)
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32_t len;
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    size_t offset = 0;
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &len);
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mName, len);
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &len);
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mVendor, len);
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mVersion);
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mHandle);
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mType);
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mMinValue);
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mMaxValue);
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mResolution);
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mPower);
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    offset += read(buffer, offset, &mMinDelay);
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return NO_ERROR;
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber// ----------------------------------------------------------------------------
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}; // namespace android
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber