Sensor.cpp revision a7352c9f4a6e642c29782b19db5bc0bd98feddc8
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),
35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian      mPower(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;
49a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian}
50a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian
51589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor()
52589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
53589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
54589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
55589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const {
56589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mName;
57589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
58589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
59589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const {
60589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mVendor;
61589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
62589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const {
64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mHandle;
65589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
67589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const {
68589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mType;
69589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const {
72589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mMinValue;
73589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
74589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
75589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const {
76589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mMaxValue;
77589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
78589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
79589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const {
80589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mResolution;
81589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
82589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
83589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const {
84589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return mPower;
85589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
86589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
87589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t Sensor::getFlattenedSize() const
88589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
89589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return  sizeof(int32_t) + ((mName.length() + 3) & ~3) +
90589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            sizeof(int32_t) + ((mVendor.length() + 3) & ~3) +
91589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            sizeof(int32_t) * 2 +
92589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            sizeof(float) * 3;
93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
94589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
95589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t Sensor::getFdCount() const
96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
97589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return 0;
98589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
100589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, const String8& value) {
102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    memcpy(static_cast<char*>(buffer) + offset, value.string(), value.length());
103589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return (value.length() + 3) & ~3;
104589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
105589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
106589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
107589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, float value) {
108589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *reinterpret_cast<float*>(static_cast<char*>(buffer) + offset) = value;
109589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(float);
110589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
111589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
112589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
113589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t write(void* buffer, size_t offset, int32_t value) {
114589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *reinterpret_cast<int32_t*>(static_cast<char*>(buffer) + offset) = value;
115589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(int32_t);
116589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
117589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
118589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size,
119589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        int fds[], size_t count) const
120589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
121589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    if (size < Sensor::getFlattenedSize())
122589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return -ENOMEM;
123589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
124589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    size_t offset = 0;
125589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, int32_t(mName.length()));
126589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mName);
127589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, int32_t(mVendor.length()));
128589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mVendor);
129589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mHandle);
130589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mType);
131589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mMinValue);
132589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mMaxValue);
133589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mResolution);
134589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += write(buffer, offset, mPower);
135589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
136589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return NO_ERROR;
137589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
138589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
139589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
140589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, String8* value, int32_t len) {
141589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    value->setTo(static_cast<char const*>(buffer) + offset, len);
142589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return (len + 3) & ~3;
143589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
144589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
145589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
146589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, float* value) {
147589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *value = *reinterpret_cast<float const*>(static_cast<char const*>(buffer) + offset);
148589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(float);
149589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
150589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
151589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatic inline
152589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiansize_t read(void const* buffer, size_t offset, int32_t* value) {
153589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *value = *reinterpret_cast<int32_t const*>(static_cast<char const*>(buffer) + offset);
154589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return sizeof(int32_t);
155589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
156589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
157589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size,
158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        int fds[], size_t count)
159589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
160589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    int32_t len;
161589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    size_t offset = 0;
162589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &len);
163589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mName, len);
164589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &len);
165589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mVendor, len);
166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mHandle);
167589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mType);
168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mMinValue);
169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mMaxValue);
170589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mResolution);
171589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    offset += read(buffer, offset, &mPower);
172589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
173589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return NO_ERROR;
174589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
175589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
176589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
177589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
178