blob: 6d12225fcb42366c5496c476b142003f669b1180 [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 Akella9a844cf2014-02-11 18:58:52 -080035 mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0),
36 mWakeUpSensor(false)
Mathias Agopian589ce852010-07-13 22:21:56 -070037{
38}
39
Aravind Akella724d91d2013-06-27 12:04:23 -070040Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion)
Mathias Agopiana7352c92010-07-14 23:41:37 -070041{
42 mName = hwSensor->name;
43 mVendor = hwSensor->vendor;
Mathias Agopian2ebc4d62012-05-04 15:47:13 -070044 mVersion = hwSensor->version;
Mathias Agopiana7352c92010-07-14 23:41:37 -070045 mHandle = hwSensor->handle;
46 mType = hwSensor->type;
47 mMinValue = 0; // FIXME: minValue
48 mMaxValue = hwSensor->maxRange; // FIXME: maxValue
49 mResolution = hwSensor->resolution;
50 mPower = hwSensor->power;
Mathias Agopiana48bcf62010-07-29 16:51:38 -070051 mMinDelay = hwSensor->minDelay;
Aravind Akella9a844cf2014-02-11 18:58:52 -080052 mWakeUpSensor = false;
Aravind Akella70018042014-04-07 22:52:37 +000053
Aravind Akella724d91d2013-06-27 12:04:23 -070054 // Set fifo event count zero for older devices which do not support batching. Fused
55 // sensors also have their fifo counts set to zero.
56 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) {
57 mFifoReservedEventCount = hwSensor->fifoReservedEventCount;
58 mFifoMaxEventCount = hwSensor->fifoMaxEventCount;
Aravind Akellad35e3af2014-05-12 17:14:56 -070059 } else {
60 mFifoReservedEventCount = 0;
61 mFifoMaxEventCount = 0;
Aravind Akella70018042014-04-07 22:52:37 +000062 }
63
64 // Ensure existing sensors have correct string type and required
65 // permissions.
66 switch (mType) {
67 case SENSOR_TYPE_ACCELEROMETER:
68 mStringType = SENSOR_STRING_TYPE_ACCELEROMETER;
69 break;
70 case SENSOR_TYPE_AMBIENT_TEMPERATURE:
71 mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE;
72 break;
73 case SENSOR_TYPE_GAME_ROTATION_VECTOR:
74 mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR;
75 break;
76 case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
77 mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
78 break;
79 case SENSOR_TYPE_GRAVITY:
80 mStringType = SENSOR_STRING_TYPE_GRAVITY;
81 break;
82 case SENSOR_TYPE_GYROSCOPE:
83 mStringType = SENSOR_STRING_TYPE_GYROSCOPE;
84 break;
85 case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
86 mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED;
87 break;
88 case SENSOR_TYPE_HEART_RATE:
89 mStringType = SENSOR_STRING_TYPE_HEART_RATE;
90 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
91 break;
92 case SENSOR_TYPE_LIGHT:
93 mStringType = SENSOR_STRING_TYPE_LIGHT;
94 break;
95 case SENSOR_TYPE_LINEAR_ACCELERATION:
96 mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION;
97 break;
98 case SENSOR_TYPE_MAGNETIC_FIELD:
99 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD;
100 break;
101 case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
102 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
103 break;
104 case SENSOR_TYPE_ORIENTATION:
105 mStringType = SENSOR_STRING_TYPE_ORIENTATION;
106 break;
107 case SENSOR_TYPE_PRESSURE:
108 mStringType = SENSOR_STRING_TYPE_PRESSURE;
109 break;
110 case SENSOR_TYPE_PROXIMITY:
111 mStringType = SENSOR_STRING_TYPE_PROXIMITY;
Aravind Akella9a844cf2014-02-11 18:58:52 -0800112 mWakeUpSensor = true;
Aravind Akella70018042014-04-07 22:52:37 +0000113 break;
114 case SENSOR_TYPE_RELATIVE_HUMIDITY:
115 mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY;
116 break;
117 case SENSOR_TYPE_ROTATION_VECTOR:
118 mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR;
119 break;
120 case SENSOR_TYPE_SIGNIFICANT_MOTION:
121 mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION;
Aravind Akella9a844cf2014-02-11 18:58:52 -0800122 mWakeUpSensor = true;
Aravind Akella70018042014-04-07 22:52:37 +0000123 break;
124 case SENSOR_TYPE_STEP_COUNTER:
125 mStringType = SENSOR_STRING_TYPE_STEP_COUNTER;
126 break;
127 case SENSOR_TYPE_STEP_DETECTOR:
128 mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR;
129 break;
130 case SENSOR_TYPE_TEMPERATURE:
131 mStringType = SENSOR_STRING_TYPE_TEMPERATURE;
132 break;
Aravind Akella9a844cf2014-02-11 18:58:52 -0800133 case SENSOR_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR:
134 mStringType = SENSOR_STRING_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR;
135 break;
136 case SENSOR_TYPE_WAKE_UP_ACCELEROMETER:
137 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ACCELEROMETER;
138 mWakeUpSensor = true;
139 break;
140 case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD:
141 mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD;
142 mWakeUpSensor = true;
143 break;
144 case SENSOR_TYPE_WAKE_UP_ORIENTATION:
145 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ORIENTATION;
146 mWakeUpSensor = true;
147 break;
148 case SENSOR_TYPE_WAKE_UP_GYROSCOPE:
149 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE;
150 mWakeUpSensor = true;
151 break;
152 case SENSOR_TYPE_WAKE_UP_LIGHT:
153 mStringType = SENSOR_STRING_TYPE_WAKE_UP_LIGHT;
154 mWakeUpSensor = true;
155 break;
156 case SENSOR_TYPE_WAKE_UP_PRESSURE:
157 mStringType = SENSOR_STRING_TYPE_WAKE_UP_PRESSURE;
158 mWakeUpSensor = true;
159 break;
160 case SENSOR_TYPE_WAKE_UP_GRAVITY:
161 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GRAVITY;
162 mWakeUpSensor = true;
163 break;
164 case SENSOR_TYPE_WAKE_UP_LINEAR_ACCELERATION:
165 mStringType = SENSOR_STRING_TYPE_WAKE_UP_LINEAR_ACCELERATION;
166 mWakeUpSensor = true;
167 break;
168 case SENSOR_TYPE_WAKE_UP_ROTATION_VECTOR:
169 mStringType = SENSOR_STRING_TYPE_WAKE_UP_ROTATION_VECTOR;
170 mWakeUpSensor = true;
171 break;
172 case SENSOR_TYPE_WAKE_UP_RELATIVE_HUMIDITY:
173 mStringType = SENSOR_STRING_TYPE_WAKE_UP_RELATIVE_HUMIDITY;
174 mWakeUpSensor = true;
175 break;
176 case SENSOR_TYPE_WAKE_UP_AMBIENT_TEMPERATURE:
177 mStringType = SENSOR_STRING_TYPE_WAKE_UP_AMBIENT_TEMPERATURE;
178 mWakeUpSensor = true;
179 break;
180 case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED:
181 mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED;
182 mWakeUpSensor = true;
183 break;
184 case SENSOR_TYPE_WAKE_UP_GAME_ROTATION_VECTOR:
185 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GAME_ROTATION_VECTOR;
186 mWakeUpSensor = true;
187 break;
188 case SENSOR_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED:
189 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED;
190 mWakeUpSensor = true;
191 break;
192 case SENSOR_TYPE_WAKE_UP_STEP_DETECTOR:
193 mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_DETECTOR;
194 mWakeUpSensor = true;
195 break;
196 case SENSOR_TYPE_WAKE_UP_STEP_COUNTER:
197 mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_COUNTER;
198 mWakeUpSensor = true;
199 break;
200 case SENSOR_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR:
201 mStringType = SENSOR_STRING_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR;
202 mWakeUpSensor = true;
203 break;
204 case SENSOR_TYPE_WAKE_UP_HEART_RATE:
205 mStringType = SENSOR_STRING_TYPE_WAKE_UP_HEART_RATE;
206 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
207 mWakeUpSensor = true;
208 break;
Etienne Le Grande284a902014-05-07 19:49:05 -0700209 case SENSOR_TYPE_WAKE_GESTURE:
210 mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE;
211 mWakeUpSensor = true;
212 break;
Aravind Akella70018042014-04-07 22:52:37 +0000213 default:
Aravind Akella9a844cf2014-02-11 18:58:52 -0800214 // Only pipe the stringType, requiredPermission and flags for custom sensors.
Aravind Akella70018042014-04-07 22:52:37 +0000215 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) {
216 mStringType = hwSensor->stringType;
217 }
218 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) {
219 mRequiredPermission = hwSensor->requiredPermission;
220 }
Aravind Akella9a844cf2014-02-11 18:58:52 -0800221 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
222 mWakeUpSensor = hwSensor->flags & SENSOR_FLAG_WAKE_UP;
223 }
Aravind Akella70018042014-04-07 22:52:37 +0000224 break;
Aravind Akella724d91d2013-06-27 12:04:23 -0700225 }
Mathias Agopiana7352c92010-07-14 23:41:37 -0700226}
227
Mathias Agopian589ce852010-07-13 22:21:56 -0700228Sensor::~Sensor()
229{
230}
231
232const String8& Sensor::getName() const {
233 return mName;
234}
235
236const String8& Sensor::getVendor() const {
237 return mVendor;
238}
239
240int32_t Sensor::getHandle() const {
241 return mHandle;
242}
243
244int32_t Sensor::getType() const {
245 return mType;
246}
247
248float Sensor::getMinValue() const {
249 return mMinValue;
250}
251
252float Sensor::getMaxValue() const {
253 return mMaxValue;
254}
255
256float Sensor::getResolution() const {
257 return mResolution;
258}
259
260float Sensor::getPowerUsage() const {
261 return mPower;
262}
263
Mathias Agopiana48bcf62010-07-29 16:51:38 -0700264int32_t Sensor::getMinDelay() const {
265 return mMinDelay;
266}
267
Mathias Agopianb62013f2011-05-17 22:54:42 -0700268nsecs_t Sensor::getMinDelayNs() const {
269 return getMinDelay() * 1000;
270}
271
272int32_t Sensor::getVersion() const {
273 return mVersion;
274}
275
Aravind Akella724d91d2013-06-27 12:04:23 -0700276int32_t Sensor::getFifoReservedEventCount() const {
277 return mFifoReservedEventCount;
278}
279
280int32_t Sensor::getFifoMaxEventCount() const {
281 return mFifoMaxEventCount;
282}
283
Aravind Akella70018042014-04-07 22:52:37 +0000284const String8& Sensor::getStringType() const {
285 return mStringType;
286}
287
288const String8& Sensor::getRequiredPermission() const {
289 return mRequiredPermission;
290}
291
Aravind Akella9a844cf2014-02-11 18:58:52 -0800292bool Sensor::isWakeUpSensor() const {
293 return mWakeUpSensor;
294}
295
Mathias Agopiane1424282013-07-29 21:24:40 -0700296size_t Sensor::getFlattenedSize() const
Mathias Agopian589ce852010-07-13 22:21:56 -0700297{
Mathias Agopiane1424282013-07-29 21:24:40 -0700298 size_t fixedSize =
Mathias Agopian2ebc4d62012-05-04 15:47:13 -0700299 sizeof(int32_t) * 3 +
Mathias Agopiana48bcf62010-07-29 16:51:38 -0700300 sizeof(float) * 4 +
Aravind Akella724d91d2013-06-27 12:04:23 -0700301 sizeof(int32_t) * 3;
Mathias Agopiane1424282013-07-29 21:24:40 -0700302
303 size_t variableSize =
Aravind Akella70018042014-04-07 22:52:37 +0000304 sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) +
305 sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) +
306 sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) +
307 sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length());
Mathias Agopiane1424282013-07-29 21:24:40 -0700308
309 return fixedSize + variableSize;
Mathias Agopian589ce852010-07-13 22:21:56 -0700310}
311
Mathias Agopiane1424282013-07-29 21:24:40 -0700312status_t Sensor::flatten(void* buffer, size_t size) const {
313 if (size < getFlattenedSize()) {
314 return NO_MEMORY;
315 }
Mathias Agopian589ce852010-07-13 22:21:56 -0700316
Aravind Akella70018042014-04-07 22:52:37 +0000317 flattenString8(buffer, size, mName);
318 flattenString8(buffer, size, mVendor);
Mathias Agopiane1424282013-07-29 21:24:40 -0700319 FlattenableUtils::write(buffer, size, mVersion);
320 FlattenableUtils::write(buffer, size, mHandle);
321 FlattenableUtils::write(buffer, size, mType);
322 FlattenableUtils::write(buffer, size, mMinValue);
323 FlattenableUtils::write(buffer, size, mMaxValue);
324 FlattenableUtils::write(buffer, size, mResolution);
325 FlattenableUtils::write(buffer, size, mPower);
326 FlattenableUtils::write(buffer, size, mMinDelay);
Aravind Akella724d91d2013-06-27 12:04:23 -0700327 FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
328 FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
Aravind Akella70018042014-04-07 22:52:37 +0000329 flattenString8(buffer, size, mStringType);
330 flattenString8(buffer, size, mRequiredPermission);
Mathias Agopian589ce852010-07-13 22:21:56 -0700331 return NO_ERROR;
332}
333
Mathias Agopiane1424282013-07-29 21:24:40 -0700334status_t Sensor::unflatten(void const* buffer, size_t size) {
Aravind Akella70018042014-04-07 22:52:37 +0000335 if (!unflattenString8(buffer, size, mName)) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700336 return NO_MEMORY;
337 }
Aravind Akella70018042014-04-07 22:52:37 +0000338 if (!unflattenString8(buffer, size, mVendor)) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700339 return NO_MEMORY;
340 }
Mathias Agopiane1424282013-07-29 21:24:40 -0700341
342 size_t fixedSize =
343 sizeof(int32_t) * 3 +
344 sizeof(float) * 4 +
Aravind Akella724d91d2013-06-27 12:04:23 -0700345 sizeof(int32_t) * 3;
Mathias Agopiane1424282013-07-29 21:24:40 -0700346 if (size < fixedSize) {
347 return NO_MEMORY;
348 }
349
350 FlattenableUtils::read(buffer, size, mVersion);
351 FlattenableUtils::read(buffer, size, mHandle);
352 FlattenableUtils::read(buffer, size, mType);
353 FlattenableUtils::read(buffer, size, mMinValue);
354 FlattenableUtils::read(buffer, size, mMaxValue);
355 FlattenableUtils::read(buffer, size, mResolution);
356 FlattenableUtils::read(buffer, size, mPower);
357 FlattenableUtils::read(buffer, size, mMinDelay);
Aravind Akella724d91d2013-06-27 12:04:23 -0700358 FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
359 FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
Aravind Akella70018042014-04-07 22:52:37 +0000360
361 if (!unflattenString8(buffer, size, mStringType)) {
362 return NO_MEMORY;
363 }
364 if (!unflattenString8(buffer, size, mRequiredPermission)) {
365 return NO_MEMORY;
366 }
Mathias Agopian589ce852010-07-13 22:21:56 -0700367 return NO_ERROR;
368}
369
Aravind Akella70018042014-04-07 22:52:37 +0000370void Sensor::flattenString8(void*& buffer, size_t& size,
371 const String8& string8) {
372 uint32_t len = string8.length();
373 FlattenableUtils::write(buffer, size, len);
374 memcpy(static_cast<char*>(buffer), string8.string(), len);
375 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
376}
377
378bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) {
379 uint32_t len;
380 if (size < sizeof(len)) {
381 return false;
382 }
383 FlattenableUtils::read(buffer, size, len);
384 if (size < len) {
385 return false;
386 }
387 outputString8.setTo(static_cast<char const*>(buffer), len);
388 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
389 return true;
390}
391
Mathias Agopian589ce852010-07-13 22:21:56 -0700392// ----------------------------------------------------------------------------
393}; // namespace android