• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "AidlSensorHalWrapper.h"
18 #include "ISensorsWrapper.h"
19 #include "SensorDeviceUtils.h"
20 #include "android/hardware/sensors/2.0/types.h"
21 
22 #include <aidl/android/hardware/sensors/BnSensorsCallback.h>
23 #include <aidlcommonsupport/NativeHandle.h>
24 #include <android-base/logging.h>
25 #include <android/binder_manager.h>
26 
27 using ::aidl::android::hardware::sensors::AdditionalInfo;
28 using ::aidl::android::hardware::sensors::DynamicSensorInfo;
29 using ::aidl::android::hardware::sensors::Event;
30 using ::aidl::android::hardware::sensors::ISensors;
31 using ::aidl::android::hardware::sensors::SensorInfo;
32 using ::aidl::android::hardware::sensors::SensorStatus;
33 using ::aidl::android::hardware::sensors::SensorType;
34 using ::android::AidlMessageQueue;
35 using ::android::hardware::EventFlag;
36 using ::android::hardware::sensors::V2_1::implementation::MAX_RECEIVE_BUFFER_EVENT_COUNT;
37 
38 namespace android {
39 
40 namespace {
41 
convertToStatus(ndk::ScopedAStatus status)42 status_t convertToStatus(ndk::ScopedAStatus status) {
43     if (status.isOk()) {
44         return OK;
45     } else {
46         switch (status.getExceptionCode()) {
47             case EX_ILLEGAL_ARGUMENT: {
48                 return BAD_VALUE;
49             }
50             case EX_SECURITY: {
51                 return PERMISSION_DENIED;
52             }
53             case EX_UNSUPPORTED_OPERATION: {
54                 return INVALID_OPERATION;
55             }
56             case EX_SERVICE_SPECIFIC: {
57                 switch (status.getServiceSpecificError()) {
58                     case ISensors::ERROR_BAD_VALUE: {
59                         return BAD_VALUE;
60                     }
61                     case ISensors::ERROR_NO_MEMORY: {
62                         return NO_MEMORY;
63                     }
64                     default: {
65                         return UNKNOWN_ERROR;
66                     }
67                 }
68             }
69             default: {
70                 return UNKNOWN_ERROR;
71             }
72         }
73     }
74 }
75 
convertToSensor(const SensorInfo & src,sensor_t * dst)76 void convertToSensor(const SensorInfo &src, sensor_t *dst) {
77     dst->name = strdup(src.name.c_str());
78     dst->vendor = strdup(src.vendor.c_str());
79     dst->version = src.version;
80     dst->handle = src.sensorHandle;
81     dst->type = (int)src.type;
82     dst->maxRange = src.maxRange;
83     dst->resolution = src.resolution;
84     dst->power = src.power;
85     dst->minDelay = src.minDelayUs;
86     dst->fifoReservedEventCount = src.fifoReservedEventCount;
87     dst->fifoMaxEventCount = src.fifoMaxEventCount;
88     dst->stringType = strdup(src.typeAsString.c_str());
89     dst->requiredPermission = strdup(src.requiredPermission.c_str());
90     dst->maxDelay = src.maxDelayUs;
91     dst->flags = src.flags;
92     dst->reserved[0] = dst->reserved[1] = 0;
93 }
94 
convertToSensorEvent(const Event & src,sensors_event_t * dst)95 void convertToSensorEvent(const Event &src, sensors_event_t *dst) {
96     *dst = {.version = sizeof(sensors_event_t),
97             .sensor = src.sensorHandle,
98             .type = (int32_t)src.sensorType,
99             .reserved0 = 0,
100             .timestamp = src.timestamp};
101 
102     switch (src.sensorType) {
103         case SensorType::META_DATA: {
104             // Legacy HALs expect the handle reference in the meta data field.
105             // Copy it over from the handle of the event.
106             dst->meta_data.what = (int32_t)src.payload.get<Event::EventPayload::meta>().what;
107             dst->meta_data.sensor = src.sensorHandle;
108             // Set the sensor handle to 0 to maintain compatibility.
109             dst->sensor = 0;
110             break;
111         }
112 
113         case SensorType::ACCELEROMETER:
114         case SensorType::MAGNETIC_FIELD:
115         case SensorType::ORIENTATION:
116         case SensorType::GYROSCOPE:
117         case SensorType::GRAVITY:
118         case SensorType::LINEAR_ACCELERATION: {
119             dst->acceleration.x = src.payload.get<Event::EventPayload::vec3>().x;
120             dst->acceleration.y = src.payload.get<Event::EventPayload::vec3>().y;
121             dst->acceleration.z = src.payload.get<Event::EventPayload::vec3>().z;
122             dst->acceleration.status = (int32_t)src.payload.get<Event::EventPayload::vec3>().status;
123             break;
124         }
125 
126         case SensorType::GAME_ROTATION_VECTOR: {
127             dst->data[0] = src.payload.get<Event::EventPayload::vec4>().x;
128             dst->data[1] = src.payload.get<Event::EventPayload::vec4>().y;
129             dst->data[2] = src.payload.get<Event::EventPayload::vec4>().z;
130             dst->data[3] = src.payload.get<Event::EventPayload::vec4>().w;
131             break;
132         }
133 
134         case SensorType::ROTATION_VECTOR:
135         case SensorType::GEOMAGNETIC_ROTATION_VECTOR: {
136             dst->data[0] = src.payload.get<Event::EventPayload::data>().values[0];
137             dst->data[1] = src.payload.get<Event::EventPayload::data>().values[1];
138             dst->data[2] = src.payload.get<Event::EventPayload::data>().values[2];
139             dst->data[3] = src.payload.get<Event::EventPayload::data>().values[3];
140             dst->data[4] = src.payload.get<Event::EventPayload::data>().values[4];
141             break;
142         }
143 
144         case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
145         case SensorType::GYROSCOPE_UNCALIBRATED:
146         case SensorType::ACCELEROMETER_UNCALIBRATED: {
147             dst->uncalibrated_gyro.x_uncalib = src.payload.get<Event::EventPayload::uncal>().x;
148             dst->uncalibrated_gyro.y_uncalib = src.payload.get<Event::EventPayload::uncal>().y;
149             dst->uncalibrated_gyro.z_uncalib = src.payload.get<Event::EventPayload::uncal>().z;
150             dst->uncalibrated_gyro.x_bias = src.payload.get<Event::EventPayload::uncal>().xBias;
151             dst->uncalibrated_gyro.y_bias = src.payload.get<Event::EventPayload::uncal>().yBias;
152             dst->uncalibrated_gyro.z_bias = src.payload.get<Event::EventPayload::uncal>().zBias;
153             break;
154         }
155 
156         case SensorType::HINGE_ANGLE:
157         case SensorType::DEVICE_ORIENTATION:
158         case SensorType::LIGHT:
159         case SensorType::PRESSURE:
160         case SensorType::PROXIMITY:
161         case SensorType::RELATIVE_HUMIDITY:
162         case SensorType::AMBIENT_TEMPERATURE:
163         case SensorType::SIGNIFICANT_MOTION:
164         case SensorType::STEP_DETECTOR:
165         case SensorType::TILT_DETECTOR:
166         case SensorType::WAKE_GESTURE:
167         case SensorType::GLANCE_GESTURE:
168         case SensorType::PICK_UP_GESTURE:
169         case SensorType::WRIST_TILT_GESTURE:
170         case SensorType::STATIONARY_DETECT:
171         case SensorType::MOTION_DETECT:
172         case SensorType::HEART_BEAT:
173         case SensorType::LOW_LATENCY_OFFBODY_DETECT: {
174             dst->data[0] = src.payload.get<Event::EventPayload::scalar>();
175             break;
176         }
177 
178         case SensorType::STEP_COUNTER: {
179             dst->u64.step_counter = src.payload.get<Event::EventPayload::stepCount>();
180             break;
181         }
182 
183         case SensorType::HEART_RATE: {
184             dst->heart_rate.bpm = src.payload.get<Event::EventPayload::heartRate>().bpm;
185             dst->heart_rate.status =
186                     (int8_t)src.payload.get<Event::EventPayload::heartRate>().status;
187             break;
188         }
189 
190         case SensorType::POSE_6DOF: { // 15 floats
191             for (size_t i = 0; i < 15; ++i) {
192                 dst->data[i] = src.payload.get<Event::EventPayload::pose6DOF>().values[i];
193             }
194             break;
195         }
196 
197         case SensorType::DYNAMIC_SENSOR_META: {
198             dst->dynamic_sensor_meta.connected =
199                     src.payload.get<Event::EventPayload::dynamic>().connected;
200             dst->dynamic_sensor_meta.handle =
201                     src.payload.get<Event::EventPayload::dynamic>().sensorHandle;
202             dst->dynamic_sensor_meta.sensor = NULL; // to be filled in later
203 
204             memcpy(dst->dynamic_sensor_meta.uuid,
205                    src.payload.get<Event::EventPayload::dynamic>().uuid.values.data(), 16);
206 
207             break;
208         }
209 
210         case SensorType::ADDITIONAL_INFO: {
211             const AdditionalInfo &srcInfo = src.payload.get<Event::EventPayload::additional>();
212 
213             additional_info_event_t *dstInfo = &dst->additional_info;
214             dstInfo->type = (int32_t)srcInfo.type;
215             dstInfo->serial = srcInfo.serial;
216 
217             switch (srcInfo.payload.getTag()) {
218                 case AdditionalInfo::AdditionalInfoPayload::Tag::dataInt32: {
219                     const auto &values =
220                             srcInfo.payload.get<AdditionalInfo::AdditionalInfoPayload::dataInt32>()
221                                     .values;
222                     CHECK_EQ(values.size() * sizeof(int32_t), sizeof(dstInfo->data_int32));
223                     memcpy(dstInfo->data_int32, values.data(), sizeof(dstInfo->data_int32));
224                     break;
225                 }
226                 case AdditionalInfo::AdditionalInfoPayload::Tag::dataFloat: {
227                     const auto &values =
228                             srcInfo.payload.get<AdditionalInfo::AdditionalInfoPayload::dataFloat>()
229                                     .values;
230                     CHECK_EQ(values.size() * sizeof(float), sizeof(dstInfo->data_float));
231                     memcpy(dstInfo->data_float, values.data(), sizeof(dstInfo->data_float));
232                     break;
233                 }
234                 default: {
235                     ALOGE("Invalid sensor additional info tag: %d", (int)srcInfo.payload.getTag());
236                 }
237             }
238             break;
239         }
240 
241         case SensorType::HEAD_TRACKER: {
242             const auto &ht = src.payload.get<Event::EventPayload::headTracker>();
243             dst->head_tracker.rx = ht.rx;
244             dst->head_tracker.ry = ht.ry;
245             dst->head_tracker.rz = ht.rz;
246             dst->head_tracker.vx = ht.vx;
247             dst->head_tracker.vy = ht.vy;
248             dst->head_tracker.vz = ht.vz;
249             dst->head_tracker.discontinuity_count = ht.discontinuityCount;
250             break;
251         }
252 
253         case SensorType::ACCELEROMETER_LIMITED_AXES:
254         case SensorType::GYROSCOPE_LIMITED_AXES:
255             dst->limited_axes_imu.x = src.payload.get<Event::EventPayload::limitedAxesImu>().x;
256             dst->limited_axes_imu.y = src.payload.get<Event::EventPayload::limitedAxesImu>().y;
257             dst->limited_axes_imu.z = src.payload.get<Event::EventPayload::limitedAxesImu>().z;
258             dst->limited_axes_imu.x_supported =
259                     src.payload.get<Event::EventPayload::limitedAxesImu>().xSupported;
260             dst->limited_axes_imu.y_supported =
261                     src.payload.get<Event::EventPayload::limitedAxesImu>().ySupported;
262             dst->limited_axes_imu.z_supported =
263                     src.payload.get<Event::EventPayload::limitedAxesImu>().zSupported;
264             break;
265 
266         case SensorType::ACCELEROMETER_LIMITED_AXES_UNCALIBRATED:
267         case SensorType::GYROSCOPE_LIMITED_AXES_UNCALIBRATED:
268             dst->limited_axes_imu_uncalibrated.x_uncalib =
269                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().x;
270             dst->limited_axes_imu_uncalibrated.y_uncalib =
271                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().y;
272             dst->limited_axes_imu_uncalibrated.z_uncalib =
273                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().z;
274             dst->limited_axes_imu_uncalibrated.x_bias =
275                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().xBias;
276             dst->limited_axes_imu_uncalibrated.y_bias =
277                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().yBias;
278             dst->limited_axes_imu_uncalibrated.z_bias =
279                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().zBias;
280             dst->limited_axes_imu_uncalibrated.x_supported =
281                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().xSupported;
282             dst->limited_axes_imu_uncalibrated.y_supported =
283                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().ySupported;
284             dst->limited_axes_imu_uncalibrated.z_supported =
285                     src.payload.get<Event::EventPayload::limitedAxesImuUncal>().zSupported;
286             break;
287 
288         case SensorType::HEADING:
289             dst->heading.heading = src.payload.get<Event::EventPayload::heading>().heading;
290             dst->heading.accuracy = src.payload.get<Event::EventPayload::heading>().accuracy;
291             break;
292 
293         default: {
294             CHECK_GE((int32_t)src.sensorType, (int32_t)SensorType::DEVICE_PRIVATE_BASE);
295 
296             memcpy(dst->data, src.payload.get<Event::EventPayload::data>().values.data(),
297                    16 * sizeof(float));
298             break;
299         }
300     }
301 }
302 
convertFromSensorEvent(const sensors_event_t & src,Event * dst)303 void convertFromSensorEvent(const sensors_event_t &src, Event *dst) {
304     *dst = {
305             .timestamp = src.timestamp,
306             .sensorHandle = src.sensor,
307             .sensorType = (SensorType)src.type,
308     };
309 
310     switch (dst->sensorType) {
311         case SensorType::META_DATA: {
312             Event::EventPayload::MetaData meta;
313             meta.what = (Event::EventPayload::MetaData::MetaDataEventType)src.meta_data.what;
314             // Legacy HALs contain the handle reference in the meta data field.
315             // Copy that over to the handle of the event. In legacy HALs this
316             // field was expected to be 0.
317             dst->sensorHandle = src.meta_data.sensor;
318             dst->payload.set<Event::EventPayload::Tag::meta>(meta);
319             break;
320         }
321 
322         case SensorType::ACCELEROMETER:
323         case SensorType::MAGNETIC_FIELD:
324         case SensorType::ORIENTATION:
325         case SensorType::GYROSCOPE:
326         case SensorType::GRAVITY:
327         case SensorType::LINEAR_ACCELERATION: {
328             Event::EventPayload::Vec3 vec3;
329             vec3.x = src.acceleration.x;
330             vec3.y = src.acceleration.y;
331             vec3.z = src.acceleration.z;
332             vec3.status = (SensorStatus)src.acceleration.status;
333             dst->payload.set<Event::EventPayload::Tag::vec3>(vec3);
334             break;
335         }
336 
337         case SensorType::GAME_ROTATION_VECTOR: {
338             Event::EventPayload::Vec4 vec4;
339             vec4.x = src.data[0];
340             vec4.y = src.data[1];
341             vec4.z = src.data[2];
342             vec4.w = src.data[3];
343             dst->payload.set<Event::EventPayload::Tag::vec4>(vec4);
344             break;
345         }
346 
347         case SensorType::ROTATION_VECTOR:
348         case SensorType::GEOMAGNETIC_ROTATION_VECTOR: {
349             Event::EventPayload::Data data;
350             memcpy(data.values.data(), src.data, 5 * sizeof(float));
351             dst->payload.set<Event::EventPayload::Tag::data>(data);
352             break;
353         }
354 
355         case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
356         case SensorType::GYROSCOPE_UNCALIBRATED:
357         case SensorType::ACCELEROMETER_UNCALIBRATED: {
358             Event::EventPayload::Uncal uncal;
359             uncal.x = src.uncalibrated_gyro.x_uncalib;
360             uncal.y = src.uncalibrated_gyro.y_uncalib;
361             uncal.z = src.uncalibrated_gyro.z_uncalib;
362             uncal.xBias = src.uncalibrated_gyro.x_bias;
363             uncal.yBias = src.uncalibrated_gyro.y_bias;
364             uncal.zBias = src.uncalibrated_gyro.z_bias;
365             dst->payload.set<Event::EventPayload::Tag::uncal>(uncal);
366             break;
367         }
368 
369         case SensorType::DEVICE_ORIENTATION:
370         case SensorType::LIGHT:
371         case SensorType::PRESSURE:
372         case SensorType::PROXIMITY:
373         case SensorType::RELATIVE_HUMIDITY:
374         case SensorType::AMBIENT_TEMPERATURE:
375         case SensorType::SIGNIFICANT_MOTION:
376         case SensorType::STEP_DETECTOR:
377         case SensorType::TILT_DETECTOR:
378         case SensorType::WAKE_GESTURE:
379         case SensorType::GLANCE_GESTURE:
380         case SensorType::PICK_UP_GESTURE:
381         case SensorType::WRIST_TILT_GESTURE:
382         case SensorType::STATIONARY_DETECT:
383         case SensorType::MOTION_DETECT:
384         case SensorType::HEART_BEAT:
385         case SensorType::LOW_LATENCY_OFFBODY_DETECT:
386         case SensorType::HINGE_ANGLE: {
387             dst->payload.set<Event::EventPayload::Tag::scalar>((float)src.data[0]);
388             break;
389         }
390 
391         case SensorType::STEP_COUNTER: {
392             dst->payload.set<Event::EventPayload::Tag::stepCount>(src.u64.step_counter);
393             break;
394         }
395 
396         case SensorType::HEART_RATE: {
397             Event::EventPayload::HeartRate heartRate;
398             heartRate.bpm = src.heart_rate.bpm;
399             heartRate.status = (SensorStatus)src.heart_rate.status;
400             dst->payload.set<Event::EventPayload::Tag::heartRate>(heartRate);
401             break;
402         }
403 
404         case SensorType::POSE_6DOF: { // 15 floats
405             Event::EventPayload::Pose6Dof pose6DOF;
406             for (size_t i = 0; i < 15; ++i) {
407                 pose6DOF.values[i] = src.data[i];
408             }
409             dst->payload.set<Event::EventPayload::Tag::pose6DOF>(pose6DOF);
410             break;
411         }
412 
413         case SensorType::DYNAMIC_SENSOR_META: {
414             DynamicSensorInfo dynamic;
415             dynamic.connected = src.dynamic_sensor_meta.connected;
416             dynamic.sensorHandle = src.dynamic_sensor_meta.handle;
417 
418             memcpy(dynamic.uuid.values.data(), src.dynamic_sensor_meta.uuid, 16);
419             dst->payload.set<Event::EventPayload::Tag::dynamic>(dynamic);
420             break;
421         }
422 
423         case SensorType::ADDITIONAL_INFO: {
424             AdditionalInfo info;
425             const additional_info_event_t &srcInfo = src.additional_info;
426             info.type = (AdditionalInfo::AdditionalInfoType)srcInfo.type;
427             info.serial = srcInfo.serial;
428 
429             AdditionalInfo::AdditionalInfoPayload::Int32Values data;
430             CHECK_EQ(data.values.size() * sizeof(int32_t), sizeof(srcInfo.data_int32));
431             memcpy(data.values.data(), srcInfo.data_int32, sizeof(srcInfo.data_int32));
432             info.payload.set<AdditionalInfo::AdditionalInfoPayload::Tag::dataInt32>(data);
433 
434             dst->payload.set<Event::EventPayload::Tag::additional>(info);
435             break;
436         }
437 
438         case SensorType::HEAD_TRACKER: {
439             Event::EventPayload::HeadTracker headTracker;
440             headTracker.rx = src.head_tracker.rx;
441             headTracker.ry = src.head_tracker.ry;
442             headTracker.rz = src.head_tracker.rz;
443             headTracker.vx = src.head_tracker.vx;
444             headTracker.vy = src.head_tracker.vy;
445             headTracker.vz = src.head_tracker.vz;
446             headTracker.discontinuityCount = src.head_tracker.discontinuity_count;
447 
448             dst->payload.set<Event::EventPayload::Tag::headTracker>(headTracker);
449             break;
450         }
451 
452         case SensorType::ACCELEROMETER_LIMITED_AXES:
453         case SensorType::GYROSCOPE_LIMITED_AXES: {
454             Event::EventPayload::LimitedAxesImu limitedAxesImu;
455             limitedAxesImu.x = src.limited_axes_imu.x;
456             limitedAxesImu.y = src.limited_axes_imu.y;
457             limitedAxesImu.z = src.limited_axes_imu.z;
458             limitedAxesImu.xSupported = src.limited_axes_imu.x_supported;
459             limitedAxesImu.ySupported = src.limited_axes_imu.y_supported;
460             limitedAxesImu.zSupported = src.limited_axes_imu.z_supported;
461             dst->payload.set<Event::EventPayload::Tag::limitedAxesImu>(limitedAxesImu);
462             break;
463         }
464 
465         case SensorType::ACCELEROMETER_LIMITED_AXES_UNCALIBRATED:
466         case SensorType::GYROSCOPE_LIMITED_AXES_UNCALIBRATED: {
467             Event::EventPayload::LimitedAxesImuUncal limitedAxesImuUncal;
468             limitedAxesImuUncal.x = src.limited_axes_imu_uncalibrated.x_uncalib;
469             limitedAxesImuUncal.y = src.limited_axes_imu_uncalibrated.y_uncalib;
470             limitedAxesImuUncal.z = src.limited_axes_imu_uncalibrated.z_uncalib;
471             limitedAxesImuUncal.xBias = src.limited_axes_imu_uncalibrated.x_bias;
472             limitedAxesImuUncal.yBias = src.limited_axes_imu_uncalibrated.y_bias;
473             limitedAxesImuUncal.zBias = src.limited_axes_imu_uncalibrated.z_bias;
474             limitedAxesImuUncal.xSupported = src.limited_axes_imu_uncalibrated.x_supported;
475             limitedAxesImuUncal.ySupported = src.limited_axes_imu_uncalibrated.y_supported;
476             limitedAxesImuUncal.zSupported = src.limited_axes_imu_uncalibrated.z_supported;
477             dst->payload.set<Event::EventPayload::Tag::limitedAxesImuUncal>(limitedAxesImuUncal);
478             break;
479         }
480 
481         case SensorType::HEADING: {
482             Event::EventPayload::Heading heading;
483             heading.heading = src.heading.heading;
484             heading.accuracy = src.heading.accuracy;
485             dst->payload.set<Event::EventPayload::heading>(heading);
486             break;
487         }
488 
489         default: {
490             CHECK_GE((int32_t)dst->sensorType, (int32_t)SensorType::DEVICE_PRIVATE_BASE);
491 
492             Event::EventPayload::Data data;
493             memcpy(data.values.data(), src.data, 16 * sizeof(float));
494             dst->payload.set<Event::EventPayload::Tag::data>(data);
495             break;
496         }
497     }
498 }
499 
serviceDied(void * cookie)500 void serviceDied(void *cookie) {
501     ALOGW("Sensors HAL died, attempting to reconnect.");
502     ((AidlSensorHalWrapper *)cookie)->prepareForReconnect();
503 }
504 
505 template <typename EnumType>
asBaseType(EnumType value)506 constexpr typename std::underlying_type<EnumType>::type asBaseType(EnumType value) {
507     return static_cast<typename std::underlying_type<EnumType>::type>(value);
508 }
509 
510 enum EventQueueFlagBitsInternal : uint32_t {
511     INTERNAL_WAKE = 1 << 16,
512 };
513 
514 } // anonymous namespace
515 
516 class AidlSensorsCallback : public ::aidl::android::hardware::sensors::BnSensorsCallback {
517 public:
AidlSensorsCallback(AidlSensorHalWrapper::SensorDeviceCallback * sensorDeviceCallback)518     AidlSensorsCallback(AidlSensorHalWrapper::SensorDeviceCallback *sensorDeviceCallback)
519           : mSensorDeviceCallback(sensorDeviceCallback) {}
520 
onDynamicSensorsConnected(const std::vector<SensorInfo> & sensorInfos)521     ::ndk::ScopedAStatus onDynamicSensorsConnected(
522             const std::vector<SensorInfo> &sensorInfos) override {
523         std::vector<sensor_t> sensors;
524         for (const SensorInfo &sensorInfo : sensorInfos) {
525             sensor_t sensor;
526             convertToSensor(sensorInfo, &sensor);
527             sensors.push_back(sensor);
528         }
529 
530         mSensorDeviceCallback->onDynamicSensorsConnected(sensors);
531         return ::ndk::ScopedAStatus::ok();
532     }
533 
onDynamicSensorsDisconnected(const std::vector<int32_t> & sensorHandles)534     ::ndk::ScopedAStatus onDynamicSensorsDisconnected(
535             const std::vector<int32_t> &sensorHandles) override {
536         mSensorDeviceCallback->onDynamicSensorsDisconnected(sensorHandles);
537         return ::ndk::ScopedAStatus::ok();
538     }
539 
540 private:
541     ISensorHalWrapper::SensorDeviceCallback *mSensorDeviceCallback;
542 };
543 
AidlSensorHalWrapper()544 AidlSensorHalWrapper::AidlSensorHalWrapper()
545       : mEventQueueFlag(nullptr),
546         mWakeLockQueueFlag(nullptr),
547         mDeathRecipient(AIBinder_DeathRecipient_new(serviceDied)) {}
548 
supportsPolling()549 bool AidlSensorHalWrapper::supportsPolling() {
550     return false;
551 }
552 
supportsMessageQueues()553 bool AidlSensorHalWrapper::supportsMessageQueues() {
554     return true;
555 }
556 
connect(SensorDeviceCallback * callback)557 bool AidlSensorHalWrapper::connect(SensorDeviceCallback *callback) {
558     mSensorDeviceCallback = callback;
559     mSensors = nullptr;
560 
561     auto aidlServiceName = std::string() + ISensors::descriptor + "/default";
562     if (AServiceManager_isDeclared(aidlServiceName.c_str())) {
563         if (mSensors != nullptr) {
564             AIBinder_unlinkToDeath(mSensors->asBinder().get(), mDeathRecipient.get(), this);
565         }
566 
567         ndk::SpAIBinder binder(AServiceManager_waitForService(aidlServiceName.c_str()));
568         if (binder.get() != nullptr) {
569             mSensors = ISensors::fromBinder(binder);
570             mEventQueue = std::make_unique<AidlMessageQueue<
571                     Event, SynchronizedReadWrite>>(MAX_RECEIVE_BUFFER_EVENT_COUNT,
572                                                    /*configureEventFlagWord=*/true);
573 
574             mWakeLockQueue = std::make_unique<AidlMessageQueue<
575                     int32_t, SynchronizedReadWrite>>(MAX_RECEIVE_BUFFER_EVENT_COUNT,
576                                                      /*configureEventFlagWord=*/true);
577             if (mEventQueueFlag != nullptr) {
578                 EventFlag::deleteEventFlag(&mEventQueueFlag);
579             }
580             EventFlag::createEventFlag(mEventQueue->getEventFlagWord(), &mEventQueueFlag);
581             if (mWakeLockQueueFlag != nullptr) {
582                 EventFlag::deleteEventFlag(&mWakeLockQueueFlag);
583             }
584             EventFlag::createEventFlag(mWakeLockQueue->getEventFlagWord(), &mWakeLockQueueFlag);
585 
586             CHECK(mEventQueue != nullptr && mEventQueueFlag != nullptr &&
587                   mWakeLockQueue != nullptr && mWakeLockQueueFlag != nullptr);
588 
589             mCallback = ndk::SharedRefBase::make<AidlSensorsCallback>(mSensorDeviceCallback);
590             mSensors->initialize(mEventQueue->dupeDesc(), mWakeLockQueue->dupeDesc(), mCallback);
591 
592             AIBinder_linkToDeath(mSensors->asBinder().get(), mDeathRecipient.get(), this);
593         } else {
594             ALOGE("Could not connect to declared sensors AIDL HAL");
595         }
596     }
597 
598     return mSensors != nullptr;
599 }
600 
prepareForReconnect()601 void AidlSensorHalWrapper::prepareForReconnect() {
602     mReconnecting = true;
603     if (mEventQueueFlag != nullptr) {
604         mEventQueueFlag->wake(asBaseType(INTERNAL_WAKE));
605     }
606 }
607 
poll(sensors_event_t *,size_t)608 ssize_t AidlSensorHalWrapper::poll(sensors_event_t * /* buffer */, size_t /* count */) {
609     return 0;
610 }
611 
pollFmq(sensors_event_t * buffer,size_t maxNumEventsToRead)612 ssize_t AidlSensorHalWrapper::pollFmq(sensors_event_t *buffer, size_t maxNumEventsToRead) {
613     ssize_t eventsRead = 0;
614     size_t availableEvents = mEventQueue->availableToRead();
615 
616     if (availableEvents == 0) {
617         uint32_t eventFlagState = 0;
618 
619         // Wait for events to become available. This is necessary so that the Event FMQ's read() is
620         // able to be called with the correct number of events to read. If the specified number of
621         // events is not available, then read() would return no events, possibly introducing
622         // additional latency in delivering events to applications.
623         if (mEventQueueFlag != nullptr) {
624             mEventQueueFlag->wait(asBaseType(ISensors::EVENT_QUEUE_FLAG_BITS_READ_AND_PROCESS) |
625                                           asBaseType(INTERNAL_WAKE),
626                                   &eventFlagState);
627         }
628         availableEvents = mEventQueue->availableToRead();
629 
630         if ((eventFlagState & asBaseType(INTERNAL_WAKE)) && mReconnecting) {
631             ALOGD("Event FMQ internal wake, returning from poll with no events");
632             return DEAD_OBJECT;
633         }
634     }
635 
636     size_t eventsToRead = std::min({availableEvents, maxNumEventsToRead, mEventBuffer.size()});
637     if (eventsToRead > 0) {
638         if (mEventQueue->read(mEventBuffer.data(), eventsToRead)) {
639             // Notify the Sensors HAL that sensor events have been read. This is required to support
640             // the use of writeBlocking by the Sensors HAL.
641             if (mEventQueueFlag != nullptr) {
642                 mEventQueueFlag->wake(asBaseType(ISensors::EVENT_QUEUE_FLAG_BITS_EVENTS_READ));
643             }
644 
645             for (size_t i = 0; i < eventsToRead; i++) {
646                 convertToSensorEvent(mEventBuffer[i], &buffer[i]);
647             }
648             eventsRead = eventsToRead;
649         } else {
650             ALOGW("Failed to read %zu events, currently %zu events available", eventsToRead,
651                   availableEvents);
652         }
653     }
654 
655     return eventsRead;
656 }
657 
getSensorsList()658 std::vector<sensor_t> AidlSensorHalWrapper::getSensorsList() {
659     std::vector<sensor_t> sensorsFound;
660 
661     if (mSensors != nullptr) {
662         std::vector<SensorInfo> list;
663         mSensors->getSensorsList(&list);
664         for (size_t i = 0; i < list.size(); i++) {
665             sensor_t sensor;
666             convertToSensor(list[i], &sensor);
667             sensorsFound.push_back(sensor);
668         }
669     }
670 
671     return sensorsFound;
672 }
673 
setOperationMode(SensorService::Mode mode)674 status_t AidlSensorHalWrapper::setOperationMode(SensorService::Mode mode) {
675     if (mSensors == nullptr) return NO_INIT;
676     return convertToStatus(mSensors->setOperationMode(static_cast<ISensors::OperationMode>(mode)));
677 }
678 
activate(int32_t sensorHandle,bool enabled)679 status_t AidlSensorHalWrapper::activate(int32_t sensorHandle, bool enabled) {
680     if (mSensors == nullptr) return NO_INIT;
681     return convertToStatus(mSensors->activate(sensorHandle, enabled));
682 }
683 
batch(int32_t sensorHandle,int64_t samplingPeriodNs,int64_t maxReportLatencyNs)684 status_t AidlSensorHalWrapper::batch(int32_t sensorHandle, int64_t samplingPeriodNs,
685                                      int64_t maxReportLatencyNs) {
686     if (mSensors == nullptr) return NO_INIT;
687     return convertToStatus(mSensors->batch(sensorHandle, samplingPeriodNs, maxReportLatencyNs));
688 }
689 
flush(int32_t sensorHandle)690 status_t AidlSensorHalWrapper::flush(int32_t sensorHandle) {
691     if (mSensors == nullptr) return NO_INIT;
692     return convertToStatus(mSensors->flush(sensorHandle));
693 }
694 
injectSensorData(const sensors_event_t * event)695 status_t AidlSensorHalWrapper::injectSensorData(const sensors_event_t *event) {
696     if (mSensors == nullptr) return NO_INIT;
697 
698     Event ev;
699     convertFromSensorEvent(*event, &ev);
700     return convertToStatus(mSensors->injectSensorData(ev));
701 }
702 
registerDirectChannel(const sensors_direct_mem_t * memory,int32_t * channelHandle)703 status_t AidlSensorHalWrapper::registerDirectChannel(const sensors_direct_mem_t *memory,
704                                                      int32_t *channelHandle) {
705     if (mSensors == nullptr) return NO_INIT;
706 
707     ISensors::SharedMemInfo::SharedMemType type;
708     switch (memory->type) {
709         case SENSOR_DIRECT_MEM_TYPE_ASHMEM:
710             type = ISensors::SharedMemInfo::SharedMemType::ASHMEM;
711             break;
712         case SENSOR_DIRECT_MEM_TYPE_GRALLOC:
713             type = ISensors::SharedMemInfo::SharedMemType::GRALLOC;
714             break;
715         default:
716             return BAD_VALUE;
717     }
718 
719     if (memory->format != SENSOR_DIRECT_FMT_SENSORS_EVENT) {
720         return BAD_VALUE;
721     }
722     ISensors::SharedMemInfo::SharedMemFormat format =
723             ISensors::SharedMemInfo::SharedMemFormat::SENSORS_EVENT;
724 
725     ISensors::SharedMemInfo mem = {
726             .type = type,
727             .format = format,
728             .size = static_cast<int32_t>(memory->size),
729             .memoryHandle = dupToAidl(memory->handle),
730     };
731 
732     return convertToStatus(mSensors->registerDirectChannel(mem, channelHandle));
733 }
734 
unregisterDirectChannel(int32_t channelHandle)735 status_t AidlSensorHalWrapper::unregisterDirectChannel(int32_t channelHandle) {
736     if (mSensors == nullptr) return NO_INIT;
737     return convertToStatus(mSensors->unregisterDirectChannel(channelHandle));
738 }
739 
configureDirectChannel(int32_t sensorHandle,int32_t channelHandle,const struct sensors_direct_cfg_t * config)740 status_t AidlSensorHalWrapper::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle,
741                                                       const struct sensors_direct_cfg_t *config) {
742     if (mSensors == nullptr) return NO_INIT;
743 
744     ISensors::RateLevel rate;
745     switch (config->rate_level) {
746         case SENSOR_DIRECT_RATE_STOP:
747             rate = ISensors::RateLevel::STOP;
748             break;
749         case SENSOR_DIRECT_RATE_NORMAL:
750             rate = ISensors::RateLevel::NORMAL;
751             break;
752         case SENSOR_DIRECT_RATE_FAST:
753             rate = ISensors::RateLevel::FAST;
754             break;
755         case SENSOR_DIRECT_RATE_VERY_FAST:
756             rate = ISensors::RateLevel::VERY_FAST;
757             break;
758         default:
759             return BAD_VALUE;
760     }
761 
762     int32_t token;
763     mSensors->configDirectReport(sensorHandle, channelHandle, rate, &token);
764     return token;
765 }
766 
writeWakeLockHandled(uint32_t count)767 void AidlSensorHalWrapper::writeWakeLockHandled(uint32_t count) {
768     int signedCount = (int)count;
769     if (mWakeLockQueue->write(&signedCount)) {
770         mWakeLockQueueFlag->wake(asBaseType(ISensors::WAKE_LOCK_QUEUE_FLAG_BITS_DATA_WRITTEN));
771     } else {
772         ALOGW("Failed to write wake lock handled");
773     }
774 }
775 
776 } // namespace android
777