1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include "aidl/sensors/convert.h"
18*4d7e907cSAndroid Build Coastguard Worker #include "android-base/logging.h"
19*4d7e907cSAndroid Build Coastguard Worker
20*4d7e907cSAndroid Build Coastguard Worker namespace android {
21*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
22*4d7e907cSAndroid Build Coastguard Worker namespace sensors {
23*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::AdditionalInfo;
26*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::DynamicSensorInfo;
27*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::Event;
28*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::ISensors;
29*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::SensorInfo;
30*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::SensorStatus;
31*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::sensors::SensorType;
32*4d7e907cSAndroid Build Coastguard Worker
convertToStatus(ndk::ScopedAStatus status)33*4d7e907cSAndroid Build Coastguard Worker status_t convertToStatus(ndk::ScopedAStatus status) {
34*4d7e907cSAndroid Build Coastguard Worker if (status.isOk()) {
35*4d7e907cSAndroid Build Coastguard Worker return OK;
36*4d7e907cSAndroid Build Coastguard Worker } else {
37*4d7e907cSAndroid Build Coastguard Worker switch (status.getExceptionCode()) {
38*4d7e907cSAndroid Build Coastguard Worker case EX_ILLEGAL_ARGUMENT: {
39*4d7e907cSAndroid Build Coastguard Worker return BAD_VALUE;
40*4d7e907cSAndroid Build Coastguard Worker }
41*4d7e907cSAndroid Build Coastguard Worker case EX_SECURITY: {
42*4d7e907cSAndroid Build Coastguard Worker return PERMISSION_DENIED;
43*4d7e907cSAndroid Build Coastguard Worker }
44*4d7e907cSAndroid Build Coastguard Worker case EX_UNSUPPORTED_OPERATION: {
45*4d7e907cSAndroid Build Coastguard Worker return INVALID_OPERATION;
46*4d7e907cSAndroid Build Coastguard Worker }
47*4d7e907cSAndroid Build Coastguard Worker case EX_SERVICE_SPECIFIC: {
48*4d7e907cSAndroid Build Coastguard Worker switch (status.getServiceSpecificError()) {
49*4d7e907cSAndroid Build Coastguard Worker case ISensors::ERROR_BAD_VALUE: {
50*4d7e907cSAndroid Build Coastguard Worker return BAD_VALUE;
51*4d7e907cSAndroid Build Coastguard Worker }
52*4d7e907cSAndroid Build Coastguard Worker case ISensors::ERROR_NO_MEMORY: {
53*4d7e907cSAndroid Build Coastguard Worker return NO_MEMORY;
54*4d7e907cSAndroid Build Coastguard Worker }
55*4d7e907cSAndroid Build Coastguard Worker default: {
56*4d7e907cSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
57*4d7e907cSAndroid Build Coastguard Worker }
58*4d7e907cSAndroid Build Coastguard Worker }
59*4d7e907cSAndroid Build Coastguard Worker }
60*4d7e907cSAndroid Build Coastguard Worker default: {
61*4d7e907cSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
62*4d7e907cSAndroid Build Coastguard Worker }
63*4d7e907cSAndroid Build Coastguard Worker }
64*4d7e907cSAndroid Build Coastguard Worker }
65*4d7e907cSAndroid Build Coastguard Worker }
66*4d7e907cSAndroid Build Coastguard Worker
convertToSensor(const SensorInfo & src,sensor_t * dst)67*4d7e907cSAndroid Build Coastguard Worker void convertToSensor(const SensorInfo& src, sensor_t* dst) {
68*4d7e907cSAndroid Build Coastguard Worker dst->name = strdup(src.name.c_str());
69*4d7e907cSAndroid Build Coastguard Worker dst->vendor = strdup(src.vendor.c_str());
70*4d7e907cSAndroid Build Coastguard Worker dst->version = src.version;
71*4d7e907cSAndroid Build Coastguard Worker dst->handle = src.sensorHandle;
72*4d7e907cSAndroid Build Coastguard Worker dst->type = (int)src.type;
73*4d7e907cSAndroid Build Coastguard Worker dst->maxRange = src.maxRange;
74*4d7e907cSAndroid Build Coastguard Worker dst->resolution = src.resolution;
75*4d7e907cSAndroid Build Coastguard Worker dst->power = src.power;
76*4d7e907cSAndroid Build Coastguard Worker dst->minDelay = src.minDelayUs;
77*4d7e907cSAndroid Build Coastguard Worker dst->fifoReservedEventCount = src.fifoReservedEventCount;
78*4d7e907cSAndroid Build Coastguard Worker dst->fifoMaxEventCount = src.fifoMaxEventCount;
79*4d7e907cSAndroid Build Coastguard Worker dst->stringType = strdup(src.typeAsString.c_str());
80*4d7e907cSAndroid Build Coastguard Worker dst->requiredPermission = strdup(src.requiredPermission.c_str());
81*4d7e907cSAndroid Build Coastguard Worker dst->maxDelay = src.maxDelayUs;
82*4d7e907cSAndroid Build Coastguard Worker dst->flags = src.flags;
83*4d7e907cSAndroid Build Coastguard Worker dst->reserved[0] = dst->reserved[1] = 0;
84*4d7e907cSAndroid Build Coastguard Worker }
85*4d7e907cSAndroid Build Coastguard Worker
convertToSensorEvent(const Event & src,sensors_event_t * dst)86*4d7e907cSAndroid Build Coastguard Worker void convertToSensorEvent(const Event& src, sensors_event_t* dst) {
87*4d7e907cSAndroid Build Coastguard Worker *dst = {.version = sizeof(sensors_event_t),
88*4d7e907cSAndroid Build Coastguard Worker .sensor = src.sensorHandle,
89*4d7e907cSAndroid Build Coastguard Worker .type = (int32_t)src.sensorType,
90*4d7e907cSAndroid Build Coastguard Worker .reserved0 = 0,
91*4d7e907cSAndroid Build Coastguard Worker .timestamp = src.timestamp};
92*4d7e907cSAndroid Build Coastguard Worker
93*4d7e907cSAndroid Build Coastguard Worker switch (src.sensorType) {
94*4d7e907cSAndroid Build Coastguard Worker case SensorType::META_DATA: {
95*4d7e907cSAndroid Build Coastguard Worker // Legacy HALs expect the handle reference in the meta data field.
96*4d7e907cSAndroid Build Coastguard Worker // Copy it over from the handle of the event.
97*4d7e907cSAndroid Build Coastguard Worker dst->meta_data.what = (int32_t)src.payload.get<Event::EventPayload::meta>().what;
98*4d7e907cSAndroid Build Coastguard Worker dst->meta_data.sensor = src.sensorHandle;
99*4d7e907cSAndroid Build Coastguard Worker // Set the sensor handle to 0 to maintain compatibility.
100*4d7e907cSAndroid Build Coastguard Worker dst->sensor = 0;
101*4d7e907cSAndroid Build Coastguard Worker break;
102*4d7e907cSAndroid Build Coastguard Worker }
103*4d7e907cSAndroid Build Coastguard Worker
104*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER:
105*4d7e907cSAndroid Build Coastguard Worker case SensorType::MAGNETIC_FIELD:
106*4d7e907cSAndroid Build Coastguard Worker case SensorType::ORIENTATION:
107*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE:
108*4d7e907cSAndroid Build Coastguard Worker case SensorType::GRAVITY:
109*4d7e907cSAndroid Build Coastguard Worker case SensorType::LINEAR_ACCELERATION: {
110*4d7e907cSAndroid Build Coastguard Worker dst->acceleration.x = src.payload.get<Event::EventPayload::vec3>().x;
111*4d7e907cSAndroid Build Coastguard Worker dst->acceleration.y = src.payload.get<Event::EventPayload::vec3>().y;
112*4d7e907cSAndroid Build Coastguard Worker dst->acceleration.z = src.payload.get<Event::EventPayload::vec3>().z;
113*4d7e907cSAndroid Build Coastguard Worker dst->acceleration.status = (int32_t)src.payload.get<Event::EventPayload::vec3>().status;
114*4d7e907cSAndroid Build Coastguard Worker break;
115*4d7e907cSAndroid Build Coastguard Worker }
116*4d7e907cSAndroid Build Coastguard Worker
117*4d7e907cSAndroid Build Coastguard Worker case SensorType::GAME_ROTATION_VECTOR: {
118*4d7e907cSAndroid Build Coastguard Worker dst->data[0] = src.payload.get<Event::EventPayload::vec4>().x;
119*4d7e907cSAndroid Build Coastguard Worker dst->data[1] = src.payload.get<Event::EventPayload::vec4>().y;
120*4d7e907cSAndroid Build Coastguard Worker dst->data[2] = src.payload.get<Event::EventPayload::vec4>().z;
121*4d7e907cSAndroid Build Coastguard Worker dst->data[3] = src.payload.get<Event::EventPayload::vec4>().w;
122*4d7e907cSAndroid Build Coastguard Worker break;
123*4d7e907cSAndroid Build Coastguard Worker }
124*4d7e907cSAndroid Build Coastguard Worker
125*4d7e907cSAndroid Build Coastguard Worker case SensorType::ROTATION_VECTOR:
126*4d7e907cSAndroid Build Coastguard Worker case SensorType::GEOMAGNETIC_ROTATION_VECTOR: {
127*4d7e907cSAndroid Build Coastguard Worker dst->data[0] = src.payload.get<Event::EventPayload::data>().values[0];
128*4d7e907cSAndroid Build Coastguard Worker dst->data[1] = src.payload.get<Event::EventPayload::data>().values[1];
129*4d7e907cSAndroid Build Coastguard Worker dst->data[2] = src.payload.get<Event::EventPayload::data>().values[2];
130*4d7e907cSAndroid Build Coastguard Worker dst->data[3] = src.payload.get<Event::EventPayload::data>().values[3];
131*4d7e907cSAndroid Build Coastguard Worker dst->data[4] = src.payload.get<Event::EventPayload::data>().values[4];
132*4d7e907cSAndroid Build Coastguard Worker break;
133*4d7e907cSAndroid Build Coastguard Worker }
134*4d7e907cSAndroid Build Coastguard Worker
135*4d7e907cSAndroid Build Coastguard Worker case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
136*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_UNCALIBRATED:
137*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_UNCALIBRATED: {
138*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.x_uncalib = src.payload.get<Event::EventPayload::uncal>().x;
139*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.y_uncalib = src.payload.get<Event::EventPayload::uncal>().y;
140*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.z_uncalib = src.payload.get<Event::EventPayload::uncal>().z;
141*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.x_bias = src.payload.get<Event::EventPayload::uncal>().xBias;
142*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.y_bias = src.payload.get<Event::EventPayload::uncal>().yBias;
143*4d7e907cSAndroid Build Coastguard Worker dst->uncalibrated_gyro.z_bias = src.payload.get<Event::EventPayload::uncal>().zBias;
144*4d7e907cSAndroid Build Coastguard Worker break;
145*4d7e907cSAndroid Build Coastguard Worker }
146*4d7e907cSAndroid Build Coastguard Worker
147*4d7e907cSAndroid Build Coastguard Worker case SensorType::HINGE_ANGLE:
148*4d7e907cSAndroid Build Coastguard Worker case SensorType::DEVICE_ORIENTATION:
149*4d7e907cSAndroid Build Coastguard Worker case SensorType::LIGHT:
150*4d7e907cSAndroid Build Coastguard Worker case SensorType::PRESSURE:
151*4d7e907cSAndroid Build Coastguard Worker case SensorType::PROXIMITY:
152*4d7e907cSAndroid Build Coastguard Worker case SensorType::RELATIVE_HUMIDITY:
153*4d7e907cSAndroid Build Coastguard Worker case SensorType::AMBIENT_TEMPERATURE:
154*4d7e907cSAndroid Build Coastguard Worker case SensorType::SIGNIFICANT_MOTION:
155*4d7e907cSAndroid Build Coastguard Worker case SensorType::STEP_DETECTOR:
156*4d7e907cSAndroid Build Coastguard Worker case SensorType::TILT_DETECTOR:
157*4d7e907cSAndroid Build Coastguard Worker case SensorType::WAKE_GESTURE:
158*4d7e907cSAndroid Build Coastguard Worker case SensorType::GLANCE_GESTURE:
159*4d7e907cSAndroid Build Coastguard Worker case SensorType::PICK_UP_GESTURE:
160*4d7e907cSAndroid Build Coastguard Worker case SensorType::WRIST_TILT_GESTURE:
161*4d7e907cSAndroid Build Coastguard Worker case SensorType::STATIONARY_DETECT:
162*4d7e907cSAndroid Build Coastguard Worker case SensorType::MOTION_DETECT:
163*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEART_BEAT:
164*4d7e907cSAndroid Build Coastguard Worker case SensorType::LOW_LATENCY_OFFBODY_DETECT: {
165*4d7e907cSAndroid Build Coastguard Worker dst->data[0] = src.payload.get<Event::EventPayload::scalar>();
166*4d7e907cSAndroid Build Coastguard Worker break;
167*4d7e907cSAndroid Build Coastguard Worker }
168*4d7e907cSAndroid Build Coastguard Worker
169*4d7e907cSAndroid Build Coastguard Worker case SensorType::STEP_COUNTER: {
170*4d7e907cSAndroid Build Coastguard Worker dst->u64.step_counter = src.payload.get<Event::EventPayload::stepCount>();
171*4d7e907cSAndroid Build Coastguard Worker break;
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker
174*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEART_RATE: {
175*4d7e907cSAndroid Build Coastguard Worker dst->heart_rate.bpm = src.payload.get<Event::EventPayload::heartRate>().bpm;
176*4d7e907cSAndroid Build Coastguard Worker dst->heart_rate.status =
177*4d7e907cSAndroid Build Coastguard Worker (int8_t)src.payload.get<Event::EventPayload::heartRate>().status;
178*4d7e907cSAndroid Build Coastguard Worker break;
179*4d7e907cSAndroid Build Coastguard Worker }
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Worker case SensorType::POSE_6DOF: { // 15 floats
182*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < 15; ++i) {
183*4d7e907cSAndroid Build Coastguard Worker dst->data[i] = src.payload.get<Event::EventPayload::pose6DOF>().values[i];
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker break;
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker
188*4d7e907cSAndroid Build Coastguard Worker case SensorType::DYNAMIC_SENSOR_META: {
189*4d7e907cSAndroid Build Coastguard Worker dst->dynamic_sensor_meta.connected =
190*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::dynamic>().connected;
191*4d7e907cSAndroid Build Coastguard Worker dst->dynamic_sensor_meta.handle =
192*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::dynamic>().sensorHandle;
193*4d7e907cSAndroid Build Coastguard Worker dst->dynamic_sensor_meta.sensor = NULL; // to be filled in later
194*4d7e907cSAndroid Build Coastguard Worker
195*4d7e907cSAndroid Build Coastguard Worker memcpy(dst->dynamic_sensor_meta.uuid,
196*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::dynamic>().uuid.values.data(), 16);
197*4d7e907cSAndroid Build Coastguard Worker
198*4d7e907cSAndroid Build Coastguard Worker break;
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker
201*4d7e907cSAndroid Build Coastguard Worker case SensorType::ADDITIONAL_INFO: {
202*4d7e907cSAndroid Build Coastguard Worker const AdditionalInfo& srcInfo = src.payload.get<Event::EventPayload::additional>();
203*4d7e907cSAndroid Build Coastguard Worker
204*4d7e907cSAndroid Build Coastguard Worker additional_info_event_t* dstInfo = &dst->additional_info;
205*4d7e907cSAndroid Build Coastguard Worker dstInfo->type = (int32_t)srcInfo.type;
206*4d7e907cSAndroid Build Coastguard Worker dstInfo->serial = srcInfo.serial;
207*4d7e907cSAndroid Build Coastguard Worker
208*4d7e907cSAndroid Build Coastguard Worker switch (srcInfo.payload.getTag()) {
209*4d7e907cSAndroid Build Coastguard Worker case AdditionalInfo::AdditionalInfoPayload::Tag::dataInt32: {
210*4d7e907cSAndroid Build Coastguard Worker const auto& values =
211*4d7e907cSAndroid Build Coastguard Worker srcInfo.payload.get<AdditionalInfo::AdditionalInfoPayload::dataInt32>()
212*4d7e907cSAndroid Build Coastguard Worker .values;
213*4d7e907cSAndroid Build Coastguard Worker CHECK_EQ(values.size() * sizeof(int32_t), sizeof(dstInfo->data_int32));
214*4d7e907cSAndroid Build Coastguard Worker memcpy(dstInfo->data_int32, values.data(), sizeof(dstInfo->data_int32));
215*4d7e907cSAndroid Build Coastguard Worker break;
216*4d7e907cSAndroid Build Coastguard Worker }
217*4d7e907cSAndroid Build Coastguard Worker case AdditionalInfo::AdditionalInfoPayload::Tag::dataFloat: {
218*4d7e907cSAndroid Build Coastguard Worker const auto& values =
219*4d7e907cSAndroid Build Coastguard Worker srcInfo.payload.get<AdditionalInfo::AdditionalInfoPayload::dataFloat>()
220*4d7e907cSAndroid Build Coastguard Worker .values;
221*4d7e907cSAndroid Build Coastguard Worker CHECK_EQ(values.size() * sizeof(float), sizeof(dstInfo->data_float));
222*4d7e907cSAndroid Build Coastguard Worker memcpy(dstInfo->data_float, values.data(), sizeof(dstInfo->data_float));
223*4d7e907cSAndroid Build Coastguard Worker break;
224*4d7e907cSAndroid Build Coastguard Worker }
225*4d7e907cSAndroid Build Coastguard Worker default: {
226*4d7e907cSAndroid Build Coastguard Worker LOG(ERROR) << "Invalid sensor additional info tag: ",
227*4d7e907cSAndroid Build Coastguard Worker (int)srcInfo.payload.getTag();
228*4d7e907cSAndroid Build Coastguard Worker }
229*4d7e907cSAndroid Build Coastguard Worker }
230*4d7e907cSAndroid Build Coastguard Worker break;
231*4d7e907cSAndroid Build Coastguard Worker }
232*4d7e907cSAndroid Build Coastguard Worker
233*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEAD_TRACKER: {
234*4d7e907cSAndroid Build Coastguard Worker const auto& ht = src.payload.get<Event::EventPayload::headTracker>();
235*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.rx = ht.rx;
236*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.ry = ht.ry;
237*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.rz = ht.rz;
238*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.vx = ht.vx;
239*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.vy = ht.vy;
240*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.vz = ht.vz;
241*4d7e907cSAndroid Build Coastguard Worker dst->head_tracker.discontinuity_count = ht.discontinuityCount;
242*4d7e907cSAndroid Build Coastguard Worker break;
243*4d7e907cSAndroid Build Coastguard Worker }
244*4d7e907cSAndroid Build Coastguard Worker
245*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_LIMITED_AXES:
246*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_LIMITED_AXES:
247*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.x = src.payload.get<Event::EventPayload::limitedAxesImu>().x;
248*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.y = src.payload.get<Event::EventPayload::limitedAxesImu>().y;
249*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.z = src.payload.get<Event::EventPayload::limitedAxesImu>().z;
250*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.x_supported =
251*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImu>().xSupported;
252*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.y_supported =
253*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImu>().ySupported;
254*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu.z_supported =
255*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImu>().zSupported;
256*4d7e907cSAndroid Build Coastguard Worker break;
257*4d7e907cSAndroid Build Coastguard Worker
258*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_LIMITED_AXES_UNCALIBRATED:
259*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_LIMITED_AXES_UNCALIBRATED:
260*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.x_uncalib =
261*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().x;
262*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.y_uncalib =
263*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().y;
264*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.z_uncalib =
265*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().z;
266*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.x_bias =
267*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().xBias;
268*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.y_bias =
269*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().yBias;
270*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.z_bias =
271*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().zBias;
272*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.x_supported =
273*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().xSupported;
274*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.y_supported =
275*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().ySupported;
276*4d7e907cSAndroid Build Coastguard Worker dst->limited_axes_imu_uncalibrated.z_supported =
277*4d7e907cSAndroid Build Coastguard Worker src.payload.get<Event::EventPayload::limitedAxesImuUncal>().zSupported;
278*4d7e907cSAndroid Build Coastguard Worker break;
279*4d7e907cSAndroid Build Coastguard Worker
280*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEADING:
281*4d7e907cSAndroid Build Coastguard Worker dst->heading.heading = src.payload.get<Event::EventPayload::heading>().heading;
282*4d7e907cSAndroid Build Coastguard Worker dst->heading.accuracy = src.payload.get<Event::EventPayload::heading>().accuracy;
283*4d7e907cSAndroid Build Coastguard Worker break;
284*4d7e907cSAndroid Build Coastguard Worker
285*4d7e907cSAndroid Build Coastguard Worker default: {
286*4d7e907cSAndroid Build Coastguard Worker CHECK_GE((int32_t)src.sensorType, (int32_t)SensorType::DEVICE_PRIVATE_BASE);
287*4d7e907cSAndroid Build Coastguard Worker
288*4d7e907cSAndroid Build Coastguard Worker memcpy(dst->data, src.payload.get<Event::EventPayload::data>().values.data(),
289*4d7e907cSAndroid Build Coastguard Worker 16 * sizeof(float));
290*4d7e907cSAndroid Build Coastguard Worker break;
291*4d7e907cSAndroid Build Coastguard Worker }
292*4d7e907cSAndroid Build Coastguard Worker }
293*4d7e907cSAndroid Build Coastguard Worker }
294*4d7e907cSAndroid Build Coastguard Worker
convertFromSensorEvent(const sensors_event_t & src,Event * dst)295*4d7e907cSAndroid Build Coastguard Worker void convertFromSensorEvent(const sensors_event_t& src, Event* dst) {
296*4d7e907cSAndroid Build Coastguard Worker *dst = {
297*4d7e907cSAndroid Build Coastguard Worker .timestamp = src.timestamp,
298*4d7e907cSAndroid Build Coastguard Worker .sensorHandle = src.sensor,
299*4d7e907cSAndroid Build Coastguard Worker .sensorType = (SensorType)src.type,
300*4d7e907cSAndroid Build Coastguard Worker };
301*4d7e907cSAndroid Build Coastguard Worker
302*4d7e907cSAndroid Build Coastguard Worker switch (dst->sensorType) {
303*4d7e907cSAndroid Build Coastguard Worker case SensorType::META_DATA: {
304*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::MetaData meta;
305*4d7e907cSAndroid Build Coastguard Worker meta.what = (Event::EventPayload::MetaData::MetaDataEventType)src.meta_data.what;
306*4d7e907cSAndroid Build Coastguard Worker // Legacy HALs contain the handle reference in the meta data field.
307*4d7e907cSAndroid Build Coastguard Worker // Copy that over to the handle of the event. In legacy HALs this
308*4d7e907cSAndroid Build Coastguard Worker // field was expected to be 0.
309*4d7e907cSAndroid Build Coastguard Worker dst->sensorHandle = src.meta_data.sensor;
310*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::meta>(meta);
311*4d7e907cSAndroid Build Coastguard Worker break;
312*4d7e907cSAndroid Build Coastguard Worker }
313*4d7e907cSAndroid Build Coastguard Worker
314*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER:
315*4d7e907cSAndroid Build Coastguard Worker case SensorType::MAGNETIC_FIELD:
316*4d7e907cSAndroid Build Coastguard Worker case SensorType::ORIENTATION:
317*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE:
318*4d7e907cSAndroid Build Coastguard Worker case SensorType::GRAVITY:
319*4d7e907cSAndroid Build Coastguard Worker case SensorType::LINEAR_ACCELERATION: {
320*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Vec3 vec3;
321*4d7e907cSAndroid Build Coastguard Worker vec3.x = src.acceleration.x;
322*4d7e907cSAndroid Build Coastguard Worker vec3.y = src.acceleration.y;
323*4d7e907cSAndroid Build Coastguard Worker vec3.z = src.acceleration.z;
324*4d7e907cSAndroid Build Coastguard Worker vec3.status = (SensorStatus)src.acceleration.status;
325*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::vec3>(vec3);
326*4d7e907cSAndroid Build Coastguard Worker break;
327*4d7e907cSAndroid Build Coastguard Worker }
328*4d7e907cSAndroid Build Coastguard Worker
329*4d7e907cSAndroid Build Coastguard Worker case SensorType::GAME_ROTATION_VECTOR: {
330*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Vec4 vec4;
331*4d7e907cSAndroid Build Coastguard Worker vec4.x = src.data[0];
332*4d7e907cSAndroid Build Coastguard Worker vec4.y = src.data[1];
333*4d7e907cSAndroid Build Coastguard Worker vec4.z = src.data[2];
334*4d7e907cSAndroid Build Coastguard Worker vec4.w = src.data[3];
335*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::vec4>(vec4);
336*4d7e907cSAndroid Build Coastguard Worker break;
337*4d7e907cSAndroid Build Coastguard Worker }
338*4d7e907cSAndroid Build Coastguard Worker
339*4d7e907cSAndroid Build Coastguard Worker case SensorType::ROTATION_VECTOR:
340*4d7e907cSAndroid Build Coastguard Worker case SensorType::GEOMAGNETIC_ROTATION_VECTOR: {
341*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Data data;
342*4d7e907cSAndroid Build Coastguard Worker memcpy(data.values.data(), src.data, 5 * sizeof(float));
343*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::data>(data);
344*4d7e907cSAndroid Build Coastguard Worker break;
345*4d7e907cSAndroid Build Coastguard Worker }
346*4d7e907cSAndroid Build Coastguard Worker
347*4d7e907cSAndroid Build Coastguard Worker case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
348*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_UNCALIBRATED:
349*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_UNCALIBRATED: {
350*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Uncal uncal;
351*4d7e907cSAndroid Build Coastguard Worker uncal.x = src.uncalibrated_gyro.x_uncalib;
352*4d7e907cSAndroid Build Coastguard Worker uncal.y = src.uncalibrated_gyro.y_uncalib;
353*4d7e907cSAndroid Build Coastguard Worker uncal.z = src.uncalibrated_gyro.z_uncalib;
354*4d7e907cSAndroid Build Coastguard Worker uncal.xBias = src.uncalibrated_gyro.x_bias;
355*4d7e907cSAndroid Build Coastguard Worker uncal.yBias = src.uncalibrated_gyro.y_bias;
356*4d7e907cSAndroid Build Coastguard Worker uncal.zBias = src.uncalibrated_gyro.z_bias;
357*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::uncal>(uncal);
358*4d7e907cSAndroid Build Coastguard Worker break;
359*4d7e907cSAndroid Build Coastguard Worker }
360*4d7e907cSAndroid Build Coastguard Worker
361*4d7e907cSAndroid Build Coastguard Worker case SensorType::DEVICE_ORIENTATION:
362*4d7e907cSAndroid Build Coastguard Worker case SensorType::LIGHT:
363*4d7e907cSAndroid Build Coastguard Worker case SensorType::PRESSURE:
364*4d7e907cSAndroid Build Coastguard Worker case SensorType::PROXIMITY:
365*4d7e907cSAndroid Build Coastguard Worker case SensorType::RELATIVE_HUMIDITY:
366*4d7e907cSAndroid Build Coastguard Worker case SensorType::AMBIENT_TEMPERATURE:
367*4d7e907cSAndroid Build Coastguard Worker case SensorType::SIGNIFICANT_MOTION:
368*4d7e907cSAndroid Build Coastguard Worker case SensorType::STEP_DETECTOR:
369*4d7e907cSAndroid Build Coastguard Worker case SensorType::TILT_DETECTOR:
370*4d7e907cSAndroid Build Coastguard Worker case SensorType::WAKE_GESTURE:
371*4d7e907cSAndroid Build Coastguard Worker case SensorType::GLANCE_GESTURE:
372*4d7e907cSAndroid Build Coastguard Worker case SensorType::PICK_UP_GESTURE:
373*4d7e907cSAndroid Build Coastguard Worker case SensorType::WRIST_TILT_GESTURE:
374*4d7e907cSAndroid Build Coastguard Worker case SensorType::STATIONARY_DETECT:
375*4d7e907cSAndroid Build Coastguard Worker case SensorType::MOTION_DETECT:
376*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEART_BEAT:
377*4d7e907cSAndroid Build Coastguard Worker case SensorType::LOW_LATENCY_OFFBODY_DETECT:
378*4d7e907cSAndroid Build Coastguard Worker case SensorType::HINGE_ANGLE: {
379*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::scalar>((float)src.data[0]);
380*4d7e907cSAndroid Build Coastguard Worker break;
381*4d7e907cSAndroid Build Coastguard Worker }
382*4d7e907cSAndroid Build Coastguard Worker
383*4d7e907cSAndroid Build Coastguard Worker case SensorType::STEP_COUNTER: {
384*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::stepCount>(src.u64.step_counter);
385*4d7e907cSAndroid Build Coastguard Worker break;
386*4d7e907cSAndroid Build Coastguard Worker }
387*4d7e907cSAndroid Build Coastguard Worker
388*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEART_RATE: {
389*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::HeartRate heartRate;
390*4d7e907cSAndroid Build Coastguard Worker heartRate.bpm = src.heart_rate.bpm;
391*4d7e907cSAndroid Build Coastguard Worker heartRate.status = (SensorStatus)src.heart_rate.status;
392*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::heartRate>(heartRate);
393*4d7e907cSAndroid Build Coastguard Worker break;
394*4d7e907cSAndroid Build Coastguard Worker }
395*4d7e907cSAndroid Build Coastguard Worker
396*4d7e907cSAndroid Build Coastguard Worker case SensorType::POSE_6DOF: { // 15 floats
397*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Pose6Dof pose6DOF;
398*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < 15; ++i) {
399*4d7e907cSAndroid Build Coastguard Worker pose6DOF.values[i] = src.data[i];
400*4d7e907cSAndroid Build Coastguard Worker }
401*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::pose6DOF>(pose6DOF);
402*4d7e907cSAndroid Build Coastguard Worker break;
403*4d7e907cSAndroid Build Coastguard Worker }
404*4d7e907cSAndroid Build Coastguard Worker
405*4d7e907cSAndroid Build Coastguard Worker case SensorType::DYNAMIC_SENSOR_META: {
406*4d7e907cSAndroid Build Coastguard Worker DynamicSensorInfo dynamic;
407*4d7e907cSAndroid Build Coastguard Worker dynamic.connected = src.dynamic_sensor_meta.connected;
408*4d7e907cSAndroid Build Coastguard Worker dynamic.sensorHandle = src.dynamic_sensor_meta.handle;
409*4d7e907cSAndroid Build Coastguard Worker
410*4d7e907cSAndroid Build Coastguard Worker memcpy(dynamic.uuid.values.data(), src.dynamic_sensor_meta.uuid, 16);
411*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::dynamic>(dynamic);
412*4d7e907cSAndroid Build Coastguard Worker break;
413*4d7e907cSAndroid Build Coastguard Worker }
414*4d7e907cSAndroid Build Coastguard Worker
415*4d7e907cSAndroid Build Coastguard Worker case SensorType::ADDITIONAL_INFO: {
416*4d7e907cSAndroid Build Coastguard Worker AdditionalInfo info;
417*4d7e907cSAndroid Build Coastguard Worker const additional_info_event_t& srcInfo = src.additional_info;
418*4d7e907cSAndroid Build Coastguard Worker info.type = (AdditionalInfo::AdditionalInfoType)srcInfo.type;
419*4d7e907cSAndroid Build Coastguard Worker info.serial = srcInfo.serial;
420*4d7e907cSAndroid Build Coastguard Worker
421*4d7e907cSAndroid Build Coastguard Worker AdditionalInfo::AdditionalInfoPayload::Int32Values data;
422*4d7e907cSAndroid Build Coastguard Worker CHECK_EQ(data.values.size() * sizeof(int32_t), sizeof(srcInfo.data_int32));
423*4d7e907cSAndroid Build Coastguard Worker memcpy(data.values.data(), srcInfo.data_int32, sizeof(srcInfo.data_int32));
424*4d7e907cSAndroid Build Coastguard Worker info.payload.set<AdditionalInfo::AdditionalInfoPayload::Tag::dataInt32>(data);
425*4d7e907cSAndroid Build Coastguard Worker
426*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::additional>(info);
427*4d7e907cSAndroid Build Coastguard Worker break;
428*4d7e907cSAndroid Build Coastguard Worker }
429*4d7e907cSAndroid Build Coastguard Worker
430*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEAD_TRACKER: {
431*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::HeadTracker headTracker;
432*4d7e907cSAndroid Build Coastguard Worker headTracker.rx = src.head_tracker.rx;
433*4d7e907cSAndroid Build Coastguard Worker headTracker.ry = src.head_tracker.ry;
434*4d7e907cSAndroid Build Coastguard Worker headTracker.rz = src.head_tracker.rz;
435*4d7e907cSAndroid Build Coastguard Worker headTracker.vx = src.head_tracker.vx;
436*4d7e907cSAndroid Build Coastguard Worker headTracker.vy = src.head_tracker.vy;
437*4d7e907cSAndroid Build Coastguard Worker headTracker.vz = src.head_tracker.vz;
438*4d7e907cSAndroid Build Coastguard Worker headTracker.discontinuityCount = src.head_tracker.discontinuity_count;
439*4d7e907cSAndroid Build Coastguard Worker
440*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::headTracker>(headTracker);
441*4d7e907cSAndroid Build Coastguard Worker break;
442*4d7e907cSAndroid Build Coastguard Worker }
443*4d7e907cSAndroid Build Coastguard Worker
444*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_LIMITED_AXES:
445*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_LIMITED_AXES: {
446*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::LimitedAxesImu limitedAxesImu;
447*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.x = src.limited_axes_imu.x;
448*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.y = src.limited_axes_imu.y;
449*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.z = src.limited_axes_imu.z;
450*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.xSupported = src.limited_axes_imu.x_supported;
451*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.ySupported = src.limited_axes_imu.y_supported;
452*4d7e907cSAndroid Build Coastguard Worker limitedAxesImu.zSupported = src.limited_axes_imu.z_supported;
453*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::limitedAxesImu>(limitedAxesImu);
454*4d7e907cSAndroid Build Coastguard Worker break;
455*4d7e907cSAndroid Build Coastguard Worker }
456*4d7e907cSAndroid Build Coastguard Worker
457*4d7e907cSAndroid Build Coastguard Worker case SensorType::ACCELEROMETER_LIMITED_AXES_UNCALIBRATED:
458*4d7e907cSAndroid Build Coastguard Worker case SensorType::GYROSCOPE_LIMITED_AXES_UNCALIBRATED: {
459*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::LimitedAxesImuUncal limitedAxesImuUncal;
460*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.x = src.limited_axes_imu_uncalibrated.x_uncalib;
461*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.y = src.limited_axes_imu_uncalibrated.y_uncalib;
462*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.z = src.limited_axes_imu_uncalibrated.z_uncalib;
463*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.xBias = src.limited_axes_imu_uncalibrated.x_bias;
464*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.yBias = src.limited_axes_imu_uncalibrated.y_bias;
465*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.zBias = src.limited_axes_imu_uncalibrated.z_bias;
466*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.xSupported = src.limited_axes_imu_uncalibrated.x_supported;
467*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.ySupported = src.limited_axes_imu_uncalibrated.y_supported;
468*4d7e907cSAndroid Build Coastguard Worker limitedAxesImuUncal.zSupported = src.limited_axes_imu_uncalibrated.z_supported;
469*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::limitedAxesImuUncal>(limitedAxesImuUncal);
470*4d7e907cSAndroid Build Coastguard Worker break;
471*4d7e907cSAndroid Build Coastguard Worker }
472*4d7e907cSAndroid Build Coastguard Worker
473*4d7e907cSAndroid Build Coastguard Worker case SensorType::HEADING: {
474*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Heading heading;
475*4d7e907cSAndroid Build Coastguard Worker heading.heading = src.heading.heading;
476*4d7e907cSAndroid Build Coastguard Worker heading.accuracy = src.heading.accuracy;
477*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::heading>(heading);
478*4d7e907cSAndroid Build Coastguard Worker break;
479*4d7e907cSAndroid Build Coastguard Worker }
480*4d7e907cSAndroid Build Coastguard Worker
481*4d7e907cSAndroid Build Coastguard Worker default: {
482*4d7e907cSAndroid Build Coastguard Worker CHECK_GE((int32_t)dst->sensorType, (int32_t)SensorType::DEVICE_PRIVATE_BASE);
483*4d7e907cSAndroid Build Coastguard Worker
484*4d7e907cSAndroid Build Coastguard Worker Event::EventPayload::Data data;
485*4d7e907cSAndroid Build Coastguard Worker memcpy(data.values.data(), src.data, 16 * sizeof(float));
486*4d7e907cSAndroid Build Coastguard Worker dst->payload.set<Event::EventPayload::Tag::data>(data);
487*4d7e907cSAndroid Build Coastguard Worker break;
488*4d7e907cSAndroid Build Coastguard Worker }
489*4d7e907cSAndroid Build Coastguard Worker }
490*4d7e907cSAndroid Build Coastguard Worker }
491*4d7e907cSAndroid Build Coastguard Worker
convertFromASensorEvent(const ASensorEvent & src,Event * dst)492*4d7e907cSAndroid Build Coastguard Worker void convertFromASensorEvent(const ASensorEvent& src, Event* dst) {
493*4d7e907cSAndroid Build Coastguard Worker convertFromSensorEvent(common::convertASensorEvent(src), dst);
494*4d7e907cSAndroid Build Coastguard Worker }
495*4d7e907cSAndroid Build Coastguard Worker
496*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
497*4d7e907cSAndroid Build Coastguard Worker } // namespace sensors
498*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
499*4d7e907cSAndroid Build Coastguard Worker } // namespace android
500