SensorDevice.cpp revision ba02cd2f6cc3f59adf66cb2b9176bfe6c9e382d1
1/* 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 <math.h> 19#include <sys/types.h> 20 21#include <utils/Atomic.h> 22#include <utils/Errors.h> 23#include <utils/Singleton.h> 24 25#include <binder/BinderService.h> 26#include <binder/Parcel.h> 27#include <binder/IServiceManager.h> 28 29#include <hardware/sensors.h> 30 31#include "SensorDevice.h" 32#include "SensorService.h" 33 34namespace android { 35// --------------------------------------------------------------------------- 36 37ANDROID_SINGLETON_STATIC_INSTANCE(SensorDevice) 38 39SensorDevice::SensorDevice() 40 : mSensorDevice(0), 41 mSensorModule(0) 42{ 43 status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, 44 (hw_module_t const**)&mSensorModule); 45 46 ALOGE_IF(err, "couldn't load %s module (%s)", 47 SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 48 49 if (mSensorModule) { 50 err = sensors_open(&mSensorModule->common, &mSensorDevice); 51 52 ALOGE_IF(err, "couldn't open device for module %s (%s)", 53 SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 54 55 if (mSensorDevice) { 56 sensor_t const* list; 57 ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list); 58 mActivationCount.setCapacity(count); 59 Info model; 60 for (size_t i=0 ; i<size_t(count) ; i++) { 61 mActivationCount.add(list[i].handle, model); 62 mSensorDevice->activate(mSensorDevice, list[i].handle, 0); 63 } 64 } 65 } 66} 67 68void SensorDevice::dump(String8& result) 69{ 70 if (!mSensorModule) return; 71 sensor_t const* list; 72 ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list); 73 74 result.appendFormat("%d h/w sensors:\n", int(count)); 75 76 Mutex::Autolock _l(mLock); 77 for (size_t i=0 ; i<size_t(count) ; i++) { 78 const Info& info = mActivationCount.valueFor(list[i].handle); 79 result.appendFormat("handle=0x%08x, active-count=%d, rates(ms)={ ", 80 list[i].handle, 81 info.rates.size()); 82 for (size_t j=0 ; j<info.rates.size() ; j++) { 83 result.appendFormat("%4.1f%s", 84 info.rates.valueAt(j) / 1e6f, 85 j<info.rates.size()-1 ? ", " : ""); 86 } 87 result.appendFormat(" }, selected=%4.1f ms\n", info.delay / 1e6f); 88 } 89} 90 91ssize_t SensorDevice::getSensorList(sensor_t const** list) { 92 if (!mSensorModule) return NO_INIT; 93 ssize_t count = mSensorModule->get_sensors_list(mSensorModule, list); 94 return count; 95} 96 97status_t SensorDevice::initCheck() const { 98 return mSensorDevice && mSensorModule ? NO_ERROR : NO_INIT; 99} 100 101ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { 102 if (!mSensorDevice) return NO_INIT; 103 ssize_t c; 104 do { 105 c = mSensorDevice->poll(mSensorDevice, buffer, count); 106 } while (c == -EINTR); 107 return c; 108} 109 110status_t SensorDevice::resetStateWithoutActuatingHardware(void *ident, int handle) 111{ 112 if (!mSensorDevice) return NO_INIT; 113 Info& info( mActivationCount.editValueFor(handle)); 114 Mutex::Autolock _l(mLock); 115 info.rates.removeItem(ident); 116 return NO_ERROR; 117} 118 119status_t SensorDevice::activate(void* ident, int handle, int enabled) 120{ 121 if (!mSensorDevice) return NO_INIT; 122 status_t err(NO_ERROR); 123 bool actuateHardware = false; 124 125 Info& info( mActivationCount.editValueFor(handle) ); 126 127 128 ALOGD_IF(DEBUG_CONNECTIONS, 129 "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%d", 130 ident, handle, enabled, info.rates.size()); 131 132 if (enabled) { 133 Mutex::Autolock _l(mLock); 134 ALOGD_IF(DEBUG_CONNECTIONS, "... index=%ld", 135 info.rates.indexOfKey(ident)); 136 137 if (info.rates.indexOfKey(ident) < 0) { 138 info.rates.add(ident, DEFAULT_EVENTS_PERIOD); 139 if (info.rates.size() == 1) { 140 actuateHardware = true; 141 } 142 } else { 143 // sensor was already activated for this ident 144 } 145 } else { 146 Mutex::Autolock _l(mLock); 147 ALOGD_IF(DEBUG_CONNECTIONS, "... index=%ld", 148 info.rates.indexOfKey(ident)); 149 150 ssize_t idx = info.rates.removeItem(ident); 151 if (idx >= 0) { 152 if (info.rates.size() == 0) { 153 actuateHardware = true; 154 } 155 } else { 156 // sensor wasn't enabled for this ident 157 } 158 } 159 160 if (actuateHardware) { 161 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w"); 162 163 err = mSensorDevice->activate(mSensorDevice, handle, enabled); 164 ALOGE_IF(err, "Error %s sensor %d (%s)", 165 enabled ? "activating" : "disabling", 166 handle, strerror(-err)); 167 } 168 169 { // scope for the lock 170 Mutex::Autolock _l(mLock); 171 nsecs_t ns = info.selectDelay(); 172 mSensorDevice->setDelay(mSensorDevice, handle, ns); 173 } 174 175 return err; 176} 177 178status_t SensorDevice::setDelay(void* ident, int handle, int64_t ns) 179{ 180 if (!mSensorDevice) return NO_INIT; 181 Mutex::Autolock _l(mLock); 182 Info& info( mActivationCount.editValueFor(handle) ); 183 status_t err = info.setDelayForIdent(ident, ns); 184 if (err < 0) return err; 185 ns = info.selectDelay(); 186 return mSensorDevice->setDelay(mSensorDevice, handle, ns); 187} 188 189int SensorDevice::getHalDeviceVersion() const { 190 if (!mSensorDevice) return -1; 191 192 return mSensorDevice->common.version; 193} 194 195// --------------------------------------------------------------------------- 196 197status_t SensorDevice::Info::setDelayForIdent(void* ident, int64_t ns) 198{ 199 ssize_t index = rates.indexOfKey(ident); 200 if (index < 0) { 201 ALOGE("Info::setDelayForIdent(ident=%p, ns=%lld) failed (%s)", 202 ident, ns, strerror(-index)); 203 return BAD_INDEX; 204 } 205 rates.editValueAt(index) = ns; 206 return NO_ERROR; 207} 208 209nsecs_t SensorDevice::Info::selectDelay() 210{ 211 nsecs_t ns = rates.valueAt(0); 212 for (size_t i=1 ; i<rates.size() ; i++) { 213 nsecs_t cur = rates.valueAt(i); 214 if (cur < ns) { 215 ns = cur; 216 } 217 } 218 delay = ns; 219 return ns; 220} 221 222// --------------------------------------------------------------------------- 223}; // namespace android 224 225