Sensor.cpp revision adb65d9add2b7350b563d4583c5efbe3f0f0aca1
19189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima/*
29189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Copyright (C) 2010 The Android Open Source Project
39189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima *
49189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Licensed under the Apache License, Version 2.0 (the "License");
59189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * you may not use this file except in compliance with the License.
69189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * You may obtain a copy of the License at
79189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima *
89189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima *      http://www.apache.org/licenses/LICENSE-2.0
99189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima *
109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Unless required by applicable law or agreed to in writing, software
119189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * distributed under the License is distributed on an "AS IS" BASIS,
129189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * See the License for the specific language governing permissions and
149189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * limitations under the License.
159189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima */
169189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
179189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <inttypes.h>
189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <stdint.h>
199189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <sys/types.h>
2064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <sys/limits.h>
21a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
2264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <utils/Errors.h>
2364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <utils/String8.h>
24e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn#include <utils/Flattenable.h>
25e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
269189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima#include <hardware/sensors.h>
2764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
2864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <gui/Sensor.h>
2964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima#include <log/log.h>
309189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
319189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima// ----------------------------------------------------------------------------
329189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimanamespace android {
339189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima// ----------------------------------------------------------------------------
349189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
359189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru OshimaSensor::Sensor()
369189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    : mHandle(0), mType(0),
37e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn      mMinValue(0), mMaxValue(0), mResolution(0),
389189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima      mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0),
395a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima      mMaxDelay(0), mFlags(0)
405a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima{
419189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima}
429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
43e2515eebf42c763c0a2d9f873a153711778cfc17Dianne HackbornSensor::Sensor(struct sensor_t const* hwSensor, int halVersion)
44e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn{
459189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    mName = hwSensor->name;
46e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    mVendor = hwSensor->vendor;
479189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    mVersion = hwSensor->version;
489189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    mHandle = hwSensor->handle;
49e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    mType = hwSensor->type;
50e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    mMinValue = 0;                      // FIXME: minValue
51e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    mMaxValue = hwSensor->maxRange;     // FIXME: maxValue
52e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    mResolution = hwSensor->resolution;
539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    mPower = hwSensor->power;
549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    mMinDelay = hwSensor->minDelay;
5564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    mFlags = 0;
569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
57e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    // Set fifo event count zero for older devices which do not support batching. Fused
589189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    // sensors also have their fifo counts set to zero.
599189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) {
6064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFifoReservedEventCount = hwSensor->fifoReservedEventCount;
6164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFifoMaxEventCount = hwSensor->fifoMaxEventCount;
6264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    } else {
6364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFifoReservedEventCount = 0;
6464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFifoMaxEventCount = 0;
6564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    }
660f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn
670f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn    if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
688ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        if (hwSensor->maxDelay > INT_MAX) {
690f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn            // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should
700f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn            // always fit in a 32 bit integer, log error and cap it to INT_MAX.
710f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn            ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(),
720f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                  static_cast<int64_t>(hwSensor->maxDelay));
738ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            mMaxDelay = INT_MAX;
740f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn        } else {
750f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn            mMaxDelay = (int32_t) hwSensor->maxDelay;
76e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
7714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn    } else {
788ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        // For older hals set maxDelay to 0.
7964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mMaxDelay = 0;
8064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    }
812784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn
822784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn    // Ensure existing sensors have correct string type, required permissions and reporting mode.
832784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn    switch (mType) {
842784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn    case SENSOR_TYPE_ACCELEROMETER:
852784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_ACCELEROMETER;
8664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
879189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        break;
8864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    case SENSOR_TYPE_AMBIENT_TEMPERATURE:
89e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima        mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE;
90e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
9164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        break;
92e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima    case SENSOR_TYPE_GAME_ROTATION_VECTOR:
9364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR;
9464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
95df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
96df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
97e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
98e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
992762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
1002762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_GRAVITY:
101df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_GRAVITY;
102df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
103df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
104df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_GYROSCOPE:
1052762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_GYROSCOPE;
1062762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
1072762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
108df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
1092762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED;
110df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
111df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
112e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    case SENSOR_TYPE_HEART_RATE:
1132762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_HEART_RATE;
1142762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
1152762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
1162762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
1172762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_LIGHT:
1182762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_LIGHT;
1192762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
1202762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
1212762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_LINEAR_ACCELERATION:
1222762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION;
1232762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
1242762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
1252762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_MAGNETIC_FIELD:
1262762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD;
1272762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
1282762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        break;
1292762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
1302762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
1318ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
132df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
1332762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn    case SENSOR_TYPE_ORIENTATION:
1342762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_ORIENTATION;
135df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
13636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        break;
1375be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    case SENSOR_TYPE_PRESSURE:
138df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_PRESSURE;
139df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
140df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
141df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_PROXIMITY:
142e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_PROXIMITY;
143df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP);
1448ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
1458ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_RELATIVE_HUMIDITY:
1468ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY;
1478ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
1488ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
1498ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_ROTATION_VECTOR:
1508ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR;
1518ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
1528ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
1538ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_SIGNIFICANT_MOTION:
1548ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION;
1558ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP);
1568ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
1578ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_STEP_COUNTER:
1588ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_STEP_COUNTER;
1598ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
1608ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
1618ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_STEP_DETECTOR:
1628ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR;
1638ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
164df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
165df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_TEMPERATURE:
166df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_TEMPERATURE;
167df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
168df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
1698ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR:
170df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_NON_WAKE_UP_PROXIMITY_SENSOR;
171df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
172df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
173df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_ACCELEROMETER:
174df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_ACCELEROMETER;
1758ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
176e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        break;
177df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD:
178df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD;
179df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
180df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
1818ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_WAKE_UP_ORIENTATION:
1820f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_ORIENTATION;
183df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
184df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
185df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_GYROSCOPE:
1868ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE;
187df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
188df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
189df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_LIGHT:
190df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_LIGHT;
191df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP);
192df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
193df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_PRESSURE:
1948ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_PRESSURE;
195df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
196df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
1978ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_WAKE_UP_GRAVITY:
198df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_GRAVITY;
199df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
2008ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
2018ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_WAKE_UP_LINEAR_ACCELERATION:
202df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_LINEAR_ACCELERATION;
203df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
2048ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
205df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_ROTATION_VECTOR:
206df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_ROTATION_VECTOR;
207df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
2088ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
2098ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_WAKE_UP_RELATIVE_HUMIDITY:
210df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_RELATIVE_HUMIDITY;
211df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP);
2128ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
213df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_AMBIENT_TEMPERATURE:
214df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_AMBIENT_TEMPERATURE;
215df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP);
216df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
217df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED:
2188ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_MAGNETIC_FIELD_UNCALIBRATED;
2198ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
220df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
2218ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    case SENSOR_TYPE_WAKE_UP_GAME_ROTATION_VECTOR:
222e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_GAME_ROTATION_VECTOR;
22339ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
22439ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn        break;
22539ec8fb9572b6f7a6c3dbc135f32f2a8cbcd640fDianne Hackborn    case SENSOR_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED:
226df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_GYROSCOPE_UNCALIBRATED;
227e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
228df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
229df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_STEP_DETECTOR:
230df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_DETECTOR;
231df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP);
232df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
233df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_STEP_COUNTER:
234df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_STEP_COUNTER;
235df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP);
236df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        break;
237df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR:
238df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_GEOMAGNETIC_ROTATION_VECTOR;
2399189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        mFlags |= (SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP);
240e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        break;
241e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    case SENSOR_TYPE_WAKE_UP_HEART_RATE:
2429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        mStringType = SENSOR_STRING_TYPE_WAKE_UP_HEART_RATE;
2439189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
244e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mFlags |= (SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP);
2452784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn        break;
246569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    case SENSOR_TYPE_WAKE_UP_TILT_DETECTOR:
2472784ff0af88128f66ae690b73d48fb7e4a211e68Dianne Hackborn        mStringType = SENSOR_STRING_TYPE_WAKE_UP_TILT_DETECTOR;
248569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        mFlags |= (SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP);
249569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        break;
250569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    case SENSOR_TYPE_WAKE_GESTURE:
251569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE;
2529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        mFlags |= (SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP);
2538ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn        break;
254569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    default:
255569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        // Only pipe the stringType, requiredPermission and flags for custom sensors.
2569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->stringType) {
2579189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima            mStringType = hwSensor->stringType;
25864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
25964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (halVersion >= SENSORS_DEVICE_API_VERSION_1_2 && hwSensor->requiredPermission) {
26064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mRequiredPermission = hwSensor->requiredPermission;
26164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
2628ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn
26364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
26464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mFlags = (int32_t) hwSensor->flags;
2651ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        } else {
266e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            // This is an OEM defined sensor on an older HAL. Use minDelay to determine the
2671ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima            // reporting mode of the sensor.
2681ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima            if (mMinDelay > 0) {
2690f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
2702f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            } else if (mMinDelay == 0) {
2710f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
2720f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn            } else if (mMinDelay < 0) {
2730f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
2742f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            }
27564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
27664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        break;
27764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    }
278589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima}
27964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
28064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru OshimaSensor::~Sensor()
281589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima{
282589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima}
28364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
28464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaconst String8& Sensor::getName() const {
28564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mName;
28664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
28764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
28864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaconst String8& Sensor::getVendor() const {
28964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mVendor;
29064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
29164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
29264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getHandle() const {
29364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mHandle;
2941ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima}
295fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
29664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getType() const {
2971ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    return mType;
29864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
29964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
30064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getMinValue() const {
30164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mMinValue;
30264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
3031ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
3041ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimafloat Sensor::getMaxValue() const {
30564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mMaxValue;
30664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
30764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
30864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getResolution() const {
30964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mResolution;
31064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
3111ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
31264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimafloat Sensor::getPowerUsage() const {
31364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mPower;
31464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
31564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
31664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getMinDelay() const {
31764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mMinDelay;
3181ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima}
31964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
32064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimansecs_t Sensor::getMinDelayNs() const {
32164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return getMinDelay() * 1000;
32264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
32364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
32464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getVersion() const {
325b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed    return mVersion;
326b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed}
327b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed
328b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedint32_t Sensor::getFifoReservedEventCount() const {
329b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed    return mFifoReservedEventCount;
330b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed}
331b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed
332b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedint32_t Sensor::getFifoMaxEventCount() const {
333b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed    return mFifoMaxEventCount;
334b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed}
335b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed
336b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedconst String8& Sensor::getStringType() const {
337b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed    return mStringType;
338b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed}
339b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed
340b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reedconst String8& Sensor::getRequiredPermission() const {
341b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed    return mRequiredPermission;
342b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed}
343b5c17a64edbdac47d8aa48951b50ea0a8e982655Mike Reed
3441ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaint32_t Sensor::getMaxDelay() const {
34564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mMaxDelay;
34664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
34764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
34864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getFlags() const {
34964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mFlags;
35064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
3511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
35264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimabool Sensor::isWakeUpSensor() const {
35364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return mFlags & SENSOR_FLAG_WAKE_UP;
35464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
35564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
35664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaint32_t Sensor::getReportingMode() const {
35764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT);
35864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
3591ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
36064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimasize_t Sensor::getFlattenedSize() const
36164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima{
36264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    size_t fixedSize =
36364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(int32_t) * 3 +
36464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(float) * 4 +
36564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(int32_t) * 5;
3661ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
36764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    size_t variableSize =
36864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) +
36964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) +
37064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) +
37164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length());
37264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
3731ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    return fixedSize + variableSize;
37464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
37564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
37664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimastatus_t Sensor::flatten(void* buffer, size_t size) const {
377a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    if (size < getFlattenedSize()) {
378a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        return NO_MEMORY;
379a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
380a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
381a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    flattenString8(buffer, size, mName);
382a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    flattenString8(buffer, size, mVendor);
383a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    FlattenableUtils::write(buffer, size, mVersion);
384a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    FlattenableUtils::write(buffer, size, mHandle);
385a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    FlattenableUtils::write(buffer, size, mType);
386a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    FlattenableUtils::write(buffer, size, mMinValue);
387a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    FlattenableUtils::write(buffer, size, mMaxValue);
38864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mResolution);
38964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mPower);
39064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mMinDelay);
39164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
3921ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
39364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    flattenString8(buffer, size, mStringType);
39464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    flattenString8(buffer, size, mRequiredPermission);
39564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mMaxDelay);
39664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    FlattenableUtils::write(buffer, size, mFlags);
39764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    return NO_ERROR;
39864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima}
39964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
40064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimastatus_t Sensor::unflatten(void const* buffer, size_t size) {
40164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    if (!unflattenString8(buffer, size, mName)) {
40264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        return NO_MEMORY;
40364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    }
40464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    if (!unflattenString8(buffer, size, mVendor)) {
40564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        return NO_MEMORY;
40664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    }
40764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
408fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    size_t fixedSize =
40964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            sizeof(int32_t) * 3 +
410fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            sizeof(float) * 4 +
4111ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima            sizeof(int32_t) * 5;
4121ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    if (size < fixedSize) {
4131ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        return NO_MEMORY;
4141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    }
4151ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
416fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mVersion);
417fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mHandle);
418fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mType);
419fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mMinValue);
420fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mMaxValue);
421fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mResolution);
422fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mPower);
423fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mMinDelay);
424fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
425fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
426fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
4271ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    if (!unflattenString8(buffer, size, mStringType)) {
4281ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        return NO_MEMORY;
429e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
430e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    if (!unflattenString8(buffer, size, mRequiredPermission)) {
431e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        return NO_MEMORY;
432e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
4332f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn    FlattenableUtils::read(buffer, size, mMaxDelay);
4345be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    FlattenableUtils::read(buffer, size, mFlags);
4352b31d53161789358de57fd396716a6503855c5daDianne Hackborn    return NO_ERROR;
4362b31d53161789358de57fd396716a6503855c5daDianne Hackborn}
437e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
438e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornvoid Sensor::flattenString8(void*& buffer, size_t& size,
439e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        const String8& string8) {
440e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    uint32_t len = string8.length();
4412b31d53161789358de57fd396716a6503855c5daDianne Hackborn    FlattenableUtils::write(buffer, size, len);
442908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    memcpy(static_cast<char*>(buffer), string8.string(), len);
4432b31d53161789358de57fd396716a6503855c5daDianne Hackborn    FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
4442b31d53161789358de57fd396716a6503855c5daDianne Hackborn}
4452b31d53161789358de57fd396716a6503855c5daDianne Hackborn
446e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornbool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) {
447e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    uint32_t len;
448e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    if (size < sizeof(len)) {
449e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        return false;
450e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
451908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    FlattenableUtils::read(buffer, size, len);
452e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    if (size < len) {
453e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        return false;
454e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
455e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    outputString8.setTo(static_cast<char const*>(buffer), len);
456e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
457e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    return true;
458e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn}
4595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
4605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn// ----------------------------------------------------------------------------
4615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn}; // namespace android
462e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn