1 /* 2 * Copyright (C) 2017 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 "ALooper.h" 18 #include "ASensorEventQueue.h" 19 #include "ASensorManager.h" 20 21 #define LOG_TAG "libsensorndkbridge" 22 #include <android-base/logging.h> 23 #include <android/looper.h> 24 #include <hidl/HidlTransportSupport.h> 25 #include <sensors/convert.h> 26 27 using android::hardware::sensors::V1_0::SensorInfo; 28 using android::frameworks::sensorservice::V1_0::IEventQueue; 29 using android::frameworks::sensorservice::V1_0::ISensorManager; 30 using android::frameworks::sensorservice::V1_0::Result; 31 using android::hardware::sensors::V1_0::SensorType; 32 using android::sp; 33 using android::wp; 34 using android::Mutex; 35 using android::status_t; 36 using android::OK; 37 using android::NO_INIT; 38 using android::BAD_VALUE; 39 using android::hardware::hidl_vec; 40 using android::hardware::Return; 41 42 static Mutex gLock; 43 44 // static 45 ASensorManager *ASensorManager::sInstance = NULL; 46 47 // static 48 ASensorManager *ASensorManager::getInstance() { 49 Mutex::Autolock autoLock(gLock); 50 if (sInstance == NULL) { 51 sInstance = new ASensorManager; 52 if (sInstance->initCheck() != OK) { 53 delete sInstance; 54 sInstance = NULL; 55 } 56 } 57 return sInstance; 58 } 59 60 void ASensorManager::SensorDeathRecipient::serviceDied( 61 uint64_t, const wp<::android::hidl::base::V1_0::IBase>&) { 62 LOG(ERROR) << "Sensor service died. Cleanup sensor manager instance!"; 63 Mutex::Autolock autoLock(gLock); 64 delete sInstance; 65 sInstance = NULL; 66 } 67 68 ASensorManager::ASensorManager() 69 : mInitCheck(NO_INIT) { 70 mManager = ISensorManager::getService(); 71 if (mManager != NULL) { 72 mDeathRecipient = new SensorDeathRecipient(); 73 Return<bool> linked = mManager->linkToDeath(mDeathRecipient, /*cookie*/ 0); 74 if (!linked.isOk()) { 75 LOG(ERROR) << "Transaction error in linking to sensor service death: " << 76 linked.description().c_str(); 77 } else if (!linked) { 78 LOG(WARNING) << "Unable to link to sensor service death notifications"; 79 } else { 80 LOG(DEBUG) << "Link to sensor service death notification successful"; 81 mInitCheck = OK; 82 } 83 } 84 } 85 86 status_t ASensorManager::initCheck() const { 87 return mInitCheck; 88 } 89 90 int ASensorManager::getSensorList(ASensorList *out) { 91 LOG(VERBOSE) << "ASensorManager::getSensorList"; 92 93 Mutex::Autolock autoLock(mLock); 94 95 if (mSensorList == NULL) { 96 Return<void> ret = 97 mManager->getSensorList([&](const auto &list, auto result) { 98 if (result != Result::OK) { 99 return; 100 } 101 102 mSensors = list; 103 }); 104 105 (void)ret.isOk(); 106 107 mSensorList.reset(new ASensorRef[mSensors.size()]); 108 for (size_t i = 0; i < mSensors.size(); ++i) { 109 mSensorList.get()[i] = 110 reinterpret_cast<ASensorRef>(&mSensors[i]); 111 } 112 } 113 114 if (out) { 115 *out = reinterpret_cast<ASensorList>(mSensorList.get()); 116 } 117 118 return mSensors.size(); 119 } 120 121 ASensorRef ASensorManager::getDefaultSensor(int type) { 122 (void)getSensorList(NULL /* list */); 123 124 ASensorRef defaultSensor = NULL; 125 126 Return<void> ret = mManager->getDefaultSensor( 127 static_cast<SensorType>(type), 128 [&](const auto &sensor, auto result) { 129 if (result != Result::OK) { 130 return; 131 } 132 133 for (size_t i = 0; i < mSensors.size(); ++i) { 134 if (sensor == mSensors[i]) { 135 defaultSensor = 136 reinterpret_cast<ASensorRef>(&mSensors[i]); 137 138 break; 139 } 140 } 141 }); 142 143 (void)ret.isOk(); 144 145 return defaultSensor; 146 } 147 148 ASensorRef ASensorManager::getDefaultSensorEx( 149 int /* type */, bool /* wakeup */) { 150 // XXX ISensorManager's getDefaultSensorEx() lacks a "wakeup" parameter. 151 return NULL; 152 } 153 154 ASensorEventQueue *ASensorManager::createEventQueue( 155 ALooper *looper, int ident, ALooper_callbackFunc callback, void *data) { 156 LOG(VERBOSE) << "ASensorManager::createEventQueue"; 157 158 sp<ASensorEventQueue> queue = 159 new ASensorEventQueue(looper, ident, callback, data); 160 161 ::android::hardware::setMinSchedulerPolicy(queue, SCHED_FIFO, 98); 162 Result result; 163 Return<void> ret = 164 mManager->createEventQueue( 165 queue, [&](const sp<IEventQueue> &queueImpl, auto tmpResult) { 166 result = tmpResult; 167 if (result != Result::OK) { 168 return; 169 } 170 171 queue->setImpl(queueImpl); 172 }); 173 174 if (!ret.isOk() || result != Result::OK) { 175 LOG(ERROR) << "FAILED to create event queue"; 176 return NULL; 177 } 178 179 queue->incStrong(NULL /* id */); 180 181 LOG(VERBOSE) << "Returning event queue " << queue.get(); 182 return queue.get(); 183 } 184 185 void ASensorManager::destroyEventQueue(ASensorEventQueue *queue) { 186 LOG(VERBOSE) << "ASensorManager::destroyEventQueue(" << queue << ")"; 187 188 queue->invalidate(); 189 190 queue->decStrong(NULL /* id */); 191 queue = NULL; 192 } 193 194 //////////////////////////////////////////////////////////////////////////////// 195 196 ASensorManager *ASensorManager_getInstance() { 197 return ASensorManager::getInstance(); 198 } 199 200 ASensorManager *ASensorManager_getInstanceForPackage( 201 const char* /* packageName */) { 202 return ASensorManager::getInstance(); 203 } 204 205 #define RETURN_IF_MANAGER_IS_NULL(x) \ 206 do { \ 207 if (manager == NULL) { \ 208 return x; \ 209 } \ 210 } while (0) 211 212 #define RETURN_IF_QUEUE_IS_NULL(x) \ 213 do { \ 214 if (queue == NULL) { \ 215 return x; \ 216 } \ 217 } while (0) 218 219 #define RETURN_IF_SENSOR_IS_NULL(x) \ 220 do { \ 221 if (sensor == NULL) { \ 222 return x; \ 223 } \ 224 } while (0) 225 226 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { 227 RETURN_IF_MANAGER_IS_NULL(BAD_VALUE); 228 return manager->getSensorList(list); 229 } 230 231 ASensor const* ASensorManager_getDefaultSensor( 232 ASensorManager* manager, int type) { 233 RETURN_IF_MANAGER_IS_NULL(NULL); 234 235 return manager->getDefaultSensor(type); 236 } 237 238 #if 0 239 ASensor const* ASensorManager_getDefaultSensorEx( 240 ASensorManager* manager, int type, bool wakeUp) { 241 RETURN_IF_MANAGER_IS_NULL(NULL); 242 243 return manager->getDefaultSensorEx(type, wakeUp); 244 } 245 #endif 246 247 ASensorEventQueue* ASensorManager_createEventQueue( 248 ASensorManager* manager, 249 ALooper* looper, 250 int ident, 251 ALooper_callbackFunc callback, 252 void* data) { 253 RETURN_IF_MANAGER_IS_NULL(NULL); 254 255 if (looper == NULL) { 256 return NULL; 257 } 258 259 return manager->createEventQueue(looper, ident, callback, data); 260 } 261 262 int ASensorManager_destroyEventQueue( 263 ASensorManager* manager, ASensorEventQueue* queue) { 264 RETURN_IF_MANAGER_IS_NULL(BAD_VALUE); 265 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 266 267 manager->destroyEventQueue(queue); 268 queue = NULL; 269 270 return OK; 271 } 272 273 #if 0 274 int ASensorManager_createSharedMemoryDirectChannel( 275 ASensorManager* manager, int fd, size_t size) { 276 RETURN_IF_MANAGER_IS_NULL(BAD_VALUE); 277 278 return OK; 279 } 280 281 int ASensorManager_createHardwareBufferDirectChannel( 282 ASensorManager* manager, AHardwareBuffer const * buffer, size_t size) { 283 RETURN_IF_MANAGER_IS_NULL(BAD_VALUE); 284 285 return OK; 286 } 287 288 void ASensorManager_destroyDirectChannel( 289 ASensorManager* manager, int channelId) { 290 } 291 292 int ASensorManager_configureDirectReport( 293 ASensorManager* manager, 294 ASensor const* sensor, 295 int channelId,int rate) { 296 RETURN_IF_MANAGER_IS_NULL(BAD_VALUE); 297 return OK; 298 } 299 #endif 300 301 int ASensorEventQueue_registerSensor( 302 ASensorEventQueue* queue, 303 ASensor const* sensor, 304 int32_t samplingPeriodUs, 305 int64_t maxBatchReportLatencyUs) { 306 LOG(VERBOSE) << "ASensorEventQueue_registerSensor"; 307 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 308 return queue->registerSensor( 309 sensor, samplingPeriodUs, maxBatchReportLatencyUs); 310 } 311 312 int ASensorEventQueue_enableSensor( 313 ASensorEventQueue* queue, ASensor const* sensor) { 314 LOG(VERBOSE) << "ASensorEventQueue_enableSensor(queue " << queue << ")"; 315 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 316 return queue->enableSensor(sensor); 317 } 318 319 int ASensorEventQueue_disableSensor( 320 ASensorEventQueue* queue, ASensor const* sensor) { 321 LOG(VERBOSE) << "ASensorEventQueue_disableSensor"; 322 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 323 return queue->disableSensor(sensor); 324 } 325 326 int ASensorEventQueue_setEventRate( 327 ASensorEventQueue* queue, 328 ASensor const* sensor, 329 int32_t usec) { 330 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 331 return queue->setEventRate(sensor, usec); 332 } 333 334 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) { 335 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 336 return queue->hasEvents(); 337 } 338 339 ssize_t ASensorEventQueue_getEvents( 340 ASensorEventQueue* queue, ASensorEvent* events, size_t count) { 341 LOG(VERBOSE) << "ASensorEventQueue_getEvents"; 342 RETURN_IF_QUEUE_IS_NULL(BAD_VALUE); 343 return queue->getEvents(events, count); 344 } 345 346 const char *ASensor_getName(ASensor const* sensor) { 347 RETURN_IF_SENSOR_IS_NULL(NULL); 348 return reinterpret_cast<const SensorInfo *>(sensor)->name.c_str(); 349 } 350 351 const char *ASensor_getVendor(ASensor const* sensor) { 352 RETURN_IF_SENSOR_IS_NULL(NULL); 353 return reinterpret_cast<const SensorInfo *>(sensor)->vendor.c_str(); 354 } 355 356 int ASensor_getType(ASensor const* sensor) { 357 RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID); 358 return static_cast<int>( 359 reinterpret_cast<const SensorInfo *>(sensor)->type); 360 } 361 362 float ASensor_getResolution(ASensor const* sensor) { 363 RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID); 364 return reinterpret_cast<const SensorInfo *>(sensor)->resolution; 365 } 366 367 int ASensor_getMinDelay(ASensor const* sensor) { 368 RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID); 369 return reinterpret_cast<const SensorInfo *>(sensor)->minDelay; 370 } 371 372 int ASensor_getFifoMaxEventCount(ASensor const* sensor) { 373 RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 374 return reinterpret_cast<const SensorInfo *>(sensor)->fifoMaxEventCount; 375 } 376 377 int ASensor_getFifoReservedEventCount(ASensor const* sensor) { 378 RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 379 return reinterpret_cast<const SensorInfo *>(sensor)->fifoReservedEventCount; 380 } 381 382 const char* ASensor_getStringType(ASensor const* sensor) { 383 RETURN_IF_SENSOR_IS_NULL(NULL); 384 return reinterpret_cast<const SensorInfo *>(sensor)->typeAsString.c_str(); 385 } 386 387 extern "C" float ASensor_getMaxRange(ASensor const* sensor) { 388 RETURN_IF_SENSOR_IS_NULL(nanf("")); 389 return reinterpret_cast<const SensorInfo *>(sensor)->maxRange; 390 } 391 392 #if 0 393 int ASensor_getReportingMode(ASensor const* sensor) { 394 RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID); 395 return 0; 396 } 397 398 bool ASensor_isWakeUpSensor(ASensor const* sensor) { 399 RETURN_IF_SENSOR_IS_NULL(false); 400 return false; 401 } 402 403 bool ASensor_isDirectChannelTypeSupported( 404 ASensor const* sensor, int channelType) { 405 RETURN_IF_SENSOR_IS_NULL(false); 406 return false; 407 } 408 409 int ASensor_getHighestDirectReportRateLevel(ASensor const* sensor) { 410 RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP); 411 return 0; 412 } 413 #endif 414 415 static ALooper *getTheLooper() { 416 static ALooper *sLooper = NULL; 417 418 Mutex::Autolock autoLock(gLock); 419 if (sLooper == NULL) { 420 sLooper = new ALooper; 421 } 422 423 return sLooper; 424 } 425 426 427 ALooper *ALooper_forThread() { 428 LOG(VERBOSE) << "ALooper_forThread"; 429 return getTheLooper(); 430 } 431 432 ALooper *ALooper_prepare(int /* opts */) { 433 LOG(VERBOSE) << "ALooper_prepare"; 434 return getTheLooper(); 435 } 436 437 int ALooper_pollOnce( 438 int timeoutMillis, int* outFd, int* outEvents, void** outData) { 439 int res = getTheLooper()->pollOnce(timeoutMillis, outFd, outEvents, outData); 440 LOG(VERBOSE) << "ALooper_pollOnce => " << res; 441 return res; 442 } 443 444 void ALooper_wake(ALooper* looper) { 445 LOG(VERBOSE) << "ALooper_wake"; 446 looper->wake(); 447 } 448