• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
getInstance()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 
serviceDied(uint64_t,const wp<::android::hidl::base::V1_0::IBase> &)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 
ASensorManager()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 
initCheck() const86 status_t ASensorManager::initCheck() const {
87     return mInitCheck;
88 }
89 
getSensorList(ASensorList * out)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 
getDefaultSensor(int type)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 
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 ident,ALooper_callbackFunc callback,void * data)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 
destroyEventQueue(ASensorEventQueue * queue)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 
ASensorManager_getInstance()196 ASensorManager *ASensorManager_getInstance() {
197     return ASensorManager::getInstance();
198 }
199 
ASensorManager_getInstanceForPackage(const char *)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 
ASensorManager_getSensorList(ASensorManager * manager,ASensorList * list)226 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) {
227     RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
228     return manager->getSensorList(list);
229 }
230 
ASensorManager_getDefaultSensor(ASensorManager * manager,int type)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 
ASensorManager_createEventQueue(ASensorManager * manager,ALooper * looper,int ident,ALooper_callbackFunc callback,void * data)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 
ASensorManager_destroyEventQueue(ASensorManager * manager,ASensorEventQueue * queue)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 
ASensorEventQueue_registerSensor(ASensorEventQueue * queue,ASensor const * sensor,int32_t samplingPeriodUs,int64_t maxBatchReportLatencyUs)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 
ASensorEventQueue_enableSensor(ASensorEventQueue * queue,ASensor const * sensor)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 
ASensorEventQueue_disableSensor(ASensorEventQueue * queue,ASensor const * sensor)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 
ASensorEventQueue_setEventRate(ASensorEventQueue * queue,ASensor const * sensor,int32_t usec)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 
ASensorEventQueue_hasEvents(ASensorEventQueue * queue)334 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) {
335     RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
336     return queue->hasEvents();
337 }
338 
ASensorEventQueue_getEvents(ASensorEventQueue * queue,ASensorEvent * events,size_t count)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 
ASensor_getName(ASensor const * sensor)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 
ASensor_getVendor(ASensor const * sensor)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 
ASensor_getType(ASensor const * sensor)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 
ASensor_getResolution(ASensor const * sensor)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 
ASensor_getMinDelay(ASensor const * sensor)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 
ASensor_getFifoMaxEventCount(ASensor const * sensor)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 
ASensor_getFifoReservedEventCount(ASensor const * sensor)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 
ASensor_getStringType(ASensor const * sensor)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 
ASensor_getMaxRange(ASensor const * sensor)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 
getTheLooper()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 
ALooper_forThread()427 ALooper *ALooper_forThread() {
428     LOG(VERBOSE) << "ALooper_forThread";
429     return getTheLooper();
430 }
431 
ALooper_prepare(int)432 ALooper *ALooper_prepare(int /* opts */) {
433     LOG(VERBOSE) << "ALooper_prepare";
434     return getTheLooper();
435 }
436 
ALooper_pollOnce(int timeoutMillis,int * outFd,int * outEvents,void ** outData)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 
ALooper_wake(ALooper * looper)444 void ALooper_wake(ALooper* looper) {
445     LOG(VERBOSE) << "ALooper_wake";
446     looper->wake();
447 }
448