Sensor.cpp revision 724d91d778e71c8186399f4955de14b54812b3ed
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), 35724d91d778e71c8186399f4955de14b54812b3edAravind Akella mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0) 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 39724d91d778e71c8186399f4955de14b54812b3edAravind AkellaSensor::Sensor(struct sensor_t const* hwSensor, int halVersion) 40a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian{ 41a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mName = hwSensor->name; 42a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mVendor = hwSensor->vendor; 432ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian mVersion = hwSensor->version; 44a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mHandle = hwSensor->handle; 45a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mType = hwSensor->type; 46a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMinValue = 0; // FIXME: minValue 47a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mMaxValue = hwSensor->maxRange; // FIXME: maxValue 48a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mResolution = hwSensor->resolution; 49a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian mPower = hwSensor->power; 50a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian mMinDelay = hwSensor->minDelay; 51724d91d778e71c8186399f4955de14b54812b3edAravind Akella // Set fifo event count zero for older devices which do not support batching. Fused 52724d91d778e71c8186399f4955de14b54812b3edAravind Akella // sensors also have their fifo counts set to zero. 53724d91d778e71c8186399f4955de14b54812b3edAravind Akella if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) { 54724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoReservedEventCount = hwSensor->fifoReservedEventCount; 55724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoMaxEventCount = hwSensor->fifoMaxEventCount; 56724d91d778e71c8186399f4955de14b54812b3edAravind Akella } else { 57724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoReservedEventCount = 0; 58724d91d778e71c8186399f4955de14b54812b3edAravind Akella mFifoMaxEventCount = 0; 59724d91d778e71c8186399f4955de14b54812b3edAravind Akella } 60a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian} 61a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 62589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensor::~Sensor() 63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 65589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getName() const { 67589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mName; 68589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 69589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianconst String8& Sensor::getVendor() const { 71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mVendor; 72589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 73589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 74589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getHandle() const { 75589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mHandle; 76589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 77589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 78589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint32_t Sensor::getType() const { 79589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mType; 80589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 81589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 82589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMinValue() const { 83589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMinValue; 84589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 85589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 86589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getMaxValue() const { 87589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mMaxValue; 88589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 89589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 90589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getResolution() const { 91589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mResolution; 92589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 94589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianfloat Sensor::getPowerUsage() const { 95589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mPower; 96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 97589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 98a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopianint32_t Sensor::getMinDelay() const { 99a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian return mMinDelay; 100a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian} 101a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian 102b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopiannsecs_t Sensor::getMinDelayNs() const { 103b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return getMinDelay() * 1000; 104b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 105b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 106b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopianint32_t Sensor::getVersion() const { 107b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian return mVersion; 108b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian} 109b62013f6aafee08cfad25a2712dc32264e44f783Mathias Agopian 110724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoReservedEventCount() const { 111724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoReservedEventCount; 112724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 113724d91d778e71c8186399f4955de14b54812b3edAravind Akella 114724d91d778e71c8186399f4955de14b54812b3edAravind Akellaint32_t Sensor::getFifoMaxEventCount() const { 115724d91d778e71c8186399f4955de14b54812b3edAravind Akella return mFifoMaxEventCount; 116724d91d778e71c8186399f4955de14b54812b3edAravind Akella} 117724d91d778e71c8186399f4955de14b54812b3edAravind Akella 118e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t Sensor::getFlattenedSize() const 119589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 120e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 1212ebc4d6d947ef488198b8777d9190c93904b4b9aMathias Agopian sizeof(int32_t) * 3 + 122a48bcf62b6a26f24a0bdd2b44bb39fadce499e92Mathias Agopian sizeof(float) * 4 + 123724d91d778e71c8186399f4955de14b54812b3edAravind Akella sizeof(int32_t) * 3; 124589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 125e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t variableSize = 126e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) + FlattenableUtils::align<4>(mName.length()) + 127e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) + FlattenableUtils::align<4>(mVendor.length()); 128589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 129e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fixedSize + variableSize; 130589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 131589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 132e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::flatten(void* buffer, size_t size) const { 133e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 134e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 135e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 136589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 137e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mName.length()); 138e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian memcpy(static_cast<char*>(buffer), mName.string(), mName.length()); 139e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(mName.length())); 140e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 141e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVendor.length()); 142e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian memcpy(static_cast<char*>(buffer), mVendor.string(), mVendor.length()); 143e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(mVendor.length())); 144e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 145e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mVersion); 146e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mHandle); 147e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mType); 148e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinValue); 149e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMaxValue); 150e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mResolution); 151e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mPower); 152e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, mMinDelay); 153724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 154724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 155589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 156589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 157589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 158e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t Sensor::unflatten(void const* buffer, size_t size) { 159e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t len; 160589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 161e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < sizeof(size_t)) { 162e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 163e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 164e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, len); 165e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < len) { 166e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 167e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 168e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian mName.setTo(static_cast<char const*>(buffer), len); 169e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 170589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 171589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 172e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < sizeof(size_t)) { 173e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 174e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 175e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, len); 176e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < len) { 177e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 178e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 179e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian mVendor.setTo(static_cast<char const*>(buffer), len); 180e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 181e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 182e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t fixedSize = 183e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(int32_t) * 3 + 184e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(float) * 4 + 185724d91d778e71c8186399f4955de14b54812b3edAravind Akella sizeof(int32_t) * 3; 186e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 187e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < fixedSize) { 188e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 189e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 190e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 191e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mVersion); 192e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mHandle); 193e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mType); 194e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinValue); 195e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMaxValue); 196e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mResolution); 197e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mPower); 198e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, mMinDelay); 199724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 200724d91d778e71c8186399f4955de14b54812b3edAravind Akella FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 201589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return NO_ERROR; 202589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 203589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 204589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 205589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 206