blob: 8f63870b9ee20fd256cc4449aeeab6d72e7bafbe [file] [log] [blame]
Mathias Agopian589ce852010-07-13 22:21:56 -07001/*
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),
Aravind Akella724d91d2013-06-27 12:04:23 -070035 mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0)
Mathias Agopian589ce852010-07-13 22:21:56 -070036{
37}
38
Aravind Akella724d91d2013-06-27 12:04:23 -070039Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion)
Mathias Agopiana7352c92010-07-14 23:41:37 -070040{
41 mName = hwSensor->name;
42 mVendor = hwSensor->vendor;
Mathias Agopian2ebc4d62012-05-04 15:47:13 -070043 mVersion = hwSensor->version;
Mathias Agopiana7352c92010-07-14 23:41:37 -070044 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;
Mathias Agopiana48bcf62010-07-29 16:51:38 -070050 mMinDelay = hwSensor->minDelay;
Aravind Akella70018042014-04-07 22:52:37 +000051
Aravind Akella724d91d2013-06-27 12:04:23 -070052 // 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;
Aravind Akellad35e3af2014-05-12 17:14:56 -070057 } else {
58 mFifoReservedEventCount = 0;
59 mFifoMaxEventCount = 0;
Aravind Akella70018042014-04-07 22:52:37 +000060 }
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;
Aravind Akella724d91d2013-06-27 12:04:23 -0700138 }
Mathias Agopiana7352c92010-07-14 23:41:37 -0700139}
140
Mathias Agopian589ce852010-07-13 22:21:56 -0700141Sensor::~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
Mathias Agopiana48bcf62010-07-29 16:51:38 -0700177int32_t Sensor::getMinDelay() const {
178 return mMinDelay;
179}
180
Mathias Agopianb62013f2011-05-17 22:54:42 -0700181nsecs_t Sensor::getMinDelayNs() const {
182 return getMinDelay() * 1000;
183}
184
185int32_t Sensor::getVersion() const {
186 return mVersion;
187}
188
Aravind Akella724d91d2013-06-27 12:04:23 -0700189int32_t Sensor::getFifoReservedEventCount() const {
190 return mFifoReservedEventCount;
191}
192
193int32_t Sensor::getFifoMaxEventCount() const {
194 return mFifoMaxEventCount;
195}
196
Aravind Akella70018042014-04-07 22:52:37 +0000197const String8& Sensor::getStringType() const {
198 return mStringType;
199}
200
201const String8& Sensor::getRequiredPermission() const {
202 return mRequiredPermission;
203}
204
Mathias Agopiane1424282013-07-29 21:24:40 -0700205size_t Sensor::getFlattenedSize() const
Mathias Agopian589ce852010-07-13 22:21:56 -0700206{
Mathias Agopiane1424282013-07-29 21:24:40 -0700207 size_t fixedSize =
Mathias Agopian2ebc4d62012-05-04 15:47:13 -0700208 sizeof(int32_t) * 3 +
Mathias Agopiana48bcf62010-07-29 16:51:38 -0700209 sizeof(float) * 4 +
Aravind Akella724d91d2013-06-27 12:04:23 -0700210 sizeof(int32_t) * 3;
Mathias Agopiane1424282013-07-29 21:24:40 -0700211
212 size_t variableSize =
Aravind Akella70018042014-04-07 22:52:37 +0000213 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());
Mathias Agopiane1424282013-07-29 21:24:40 -0700217
218 return fixedSize + variableSize;
Mathias Agopian589ce852010-07-13 22:21:56 -0700219}
220
Mathias Agopiane1424282013-07-29 21:24:40 -0700221status_t Sensor::flatten(void* buffer, size_t size) const {
222 if (size < getFlattenedSize()) {
223 return NO_MEMORY;
224 }
Mathias Agopian589ce852010-07-13 22:21:56 -0700225
Aravind Akella70018042014-04-07 22:52:37 +0000226 flattenString8(buffer, size, mName);
227 flattenString8(buffer, size, mVendor);
Mathias Agopiane1424282013-07-29 21:24:40 -0700228 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);
Aravind Akella724d91d2013-06-27 12:04:23 -0700236 FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
237 FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
Aravind Akella70018042014-04-07 22:52:37 +0000238 flattenString8(buffer, size, mStringType);
239 flattenString8(buffer, size, mRequiredPermission);
Mathias Agopian589ce852010-07-13 22:21:56 -0700240 return NO_ERROR;
241}
242
Mathias Agopiane1424282013-07-29 21:24:40 -0700243status_t Sensor::unflatten(void const* buffer, size_t size) {
Aravind Akella70018042014-04-07 22:52:37 +0000244 if (!unflattenString8(buffer, size, mName)) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700245 return NO_MEMORY;
246 }
Aravind Akella70018042014-04-07 22:52:37 +0000247 if (!unflattenString8(buffer, size, mVendor)) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700248 return NO_MEMORY;
249 }
Mathias Agopiane1424282013-07-29 21:24:40 -0700250
251 size_t fixedSize =
252 sizeof(int32_t) * 3 +
253 sizeof(float) * 4 +
Aravind Akella724d91d2013-06-27 12:04:23 -0700254 sizeof(int32_t) * 3;
Mathias Agopiane1424282013-07-29 21:24:40 -0700255 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);
Aravind Akella724d91d2013-06-27 12:04:23 -0700267 FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
268 FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
Aravind Akella70018042014-04-07 22:52:37 +0000269
270 if (!unflattenString8(buffer, size, mStringType)) {
271 return NO_MEMORY;
272 }
273 if (!unflattenString8(buffer, size, mRequiredPermission)) {
274 return NO_MEMORY;
275 }
Mathias Agopian589ce852010-07-13 22:21:56 -0700276 return NO_ERROR;
277}
278
Aravind Akella70018042014-04-07 22:52:37 +0000279void 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
Mathias Agopian589ce852010-07-13 22:21:56 -0700301// ----------------------------------------------------------------------------
302}; // namespace android