Sensor.cpp revision b62013f6aafee08cfad25a2712dc32264e44f783
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),
35a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian      mPower(0), mMinDelay(0)
36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
39a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor::Sensor(struct sensor_t const* hwSensor)
40a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian{
41a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mName = hwSensor->name;
42a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mVendor = hwSensor->vendor;
43a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mHandle = hwSensor->handle;
44a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mType = hwSensor->type;
45a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mMinValue = 0;                      // FIXME: minValue
46a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mMaxValue = hwSensor->maxRange;     // FIXME: maxValue
47a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mResolution = hwSensor->resolution;
48a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    mPower = hwSensor->power;
49a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian    mMinDelay = hwSensor->minDelay;
50a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian}
51a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian
52589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor()
53589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
54589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
55589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
56589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const {
57589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mName;
58589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
59589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
60589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const {
61589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mVendor;
62589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const {
65589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mHandle;
66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
67589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
68589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const {
69589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mType;
70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
72589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const {
73589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mMinValue;
74589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
75589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
76589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const {
77589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mMaxValue;
78589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
79589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
80589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const {
81589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mResolution;
82589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
83589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
84589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const {
85589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mPower;
86589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
87589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
88a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const {
89a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian    return mMinDelay;
90a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian}
91a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian
92b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const {
93b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian    return getMinDelay() * 1000;
94b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian}
95b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian
96b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const {
97b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian    return mVersion;
98b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian}
99b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian
100589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t Sensor::getFlattenedSize() const
101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return  sizeof(int32_t) + ((mName.length() + 3) & ~3) +
103589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            sizeof(int32_t) + ((mVendor.length() + 3) & ~3) +
104589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            sizeof(int32_t) * 2 +
105a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian            sizeof(float) * 4 +
106a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian            sizeof(int32_t);
107589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
108589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
109589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t Sensor::getFdCount() const
110589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
111589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return 0;
112589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
113589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
114589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
115589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, const String8& value) {
116589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    memcpy(static_cast<char*>(buffer) + offset, value.string(), value.length());
117589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return (value.length() + 3) & ~3;
118589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
119589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
120589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
121589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, float value) {
122589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *reinterpret_cast<float*>(static_cast<char*>(buffer) + offset) = value;
123589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(float);
124589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
125589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
126589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
127589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, int32_t value) {
128589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *reinterpret_cast<int32_t*>(static_cast<char*>(buffer) + offset) = value;
129589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(int32_t);
130589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
131589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
132589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size,
133589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        int fds[], size_t count) const
134589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
135589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    if (size < Sensor::getFlattenedSize())
136589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return -ENOMEM;
137589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
138589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    size_t offset = 0;
139589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, int32_t(mName.length()));
140589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mName);
141589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, int32_t(mVendor.length()));
142589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mVendor);
143589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mHandle);
144589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mType);
145589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mMinValue);
146589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mMaxValue);
147589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mResolution);
148589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mPower);
149a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian    offset += write(buffer, offset, mMinDelay);
150589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
151589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return NO_ERROR;
152589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
153589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
154589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
155589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, String8* value, int32_t len) {
156589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    value->setTo(static_cast<char const*>(buffer) + offset, len);
157589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return (len + 3) & ~3;
158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
159589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
160589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
161589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, float* value) {
162589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *value = *reinterpret_cast<float const*>(static_cast<char const*>(buffer) + offset);
163589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(float);
164589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
165589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
167589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, int32_t* value) {
168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *value = *reinterpret_cast<int32_t const*>(static_cast<char const*>(buffer) + offset);
169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(int32_t);
170589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
171589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
172589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size,
173589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        int fds[], size_t count)
174589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
175589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    int32_t len;
176589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    size_t offset = 0;
177589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &len);
178589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mName, len);
179589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &len);
180589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mVendor, len);
181589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mHandle);
182589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mType);
183589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mMinValue);
184589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mMaxValue);
185589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mResolution);
186589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mPower);
187a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian    offset += read(buffer, offset, &mMinDelay);
188589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
189589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return NO_ERROR;
190589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
191589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
192589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
193589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
194