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