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