/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "LimitedAxesImuSensor.h" #include "SensorDevice.h" #include "SensorFusion.h" #include "SensorServiceUtils.h" namespace android { namespace { const sensor_t DUMMY_SENSOR = {.name = "", .vendor = "", .stringType = "", .requiredPermission = ""}; } // unnamed namespace LimitedAxesImuSensor::LimitedAxesImuSensor(sensor_t const* list, size_t count, int32_t imu3dSensorType) : BaseSensor(DUMMY_SENSOR) { for (size_t i = 0; i < count; i++) { if (list[i].type == imu3dSensorType) { mImu3dSensor = Sensor(list + i); break; } } const int32_t imuLimitedAxesSensorType = convertImu3dToLimitedAxesSensorType(imu3dSensorType); const sensor_t sensor = { .name = convertLimitedAxesSensorTypeToName(imuLimitedAxesSensorType), .vendor = "AOSP", .version = 1, .handle = convertLimitedAxesSensorTypeToHandle(imuLimitedAxesSensorType), .type = imuLimitedAxesSensorType, .maxRange = mImu3dSensor.getMaxValue(), .resolution = mImu3dSensor.getResolution(), .power = mImu3dSensor.getPowerUsage(), .minDelay = mImu3dSensor.getMinDelay(), }; mSensor = Sensor(&sensor); } bool LimitedAxesImuSensor::process(sensors_event_t* outEvent, const sensors_event_t& event) { if (event.type == mImu3dSensor.getType()) { *outEvent = event; size_t imu3dDataSize = SensorServiceUtil::eventSizeBySensorType(mImu3dSensor.getType()); outEvent->data[0 + imu3dDataSize] = 1; outEvent->data[1 + imu3dDataSize] = 1; outEvent->data[2 + imu3dDataSize] = 1; outEvent->sensor = mSensor.getHandle(); outEvent->type = mSensor.getType(); return true; } return false; } status_t LimitedAxesImuSensor::activate(void* ident, bool enabled) { return mSensorDevice.activate(ident, mImu3dSensor.getHandle(), enabled); } status_t LimitedAxesImuSensor::setDelay(void* ident, int /*handle*/, int64_t ns) { return mSensorDevice.setDelay(ident, mImu3dSensor.getHandle(), ns); } int32_t LimitedAxesImuSensor::convertImu3dToLimitedAxesSensorType(int32_t imu3dSensorType) { switch (imu3dSensorType) { case SENSOR_TYPE_ACCELEROMETER: return SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES; case SENSOR_TYPE_GYROSCOPE: return SENSOR_TYPE_GYROSCOPE_LIMITED_AXES; case SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: return SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED; case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: return SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED; default: return 0; } } int32_t LimitedAxesImuSensor::convertLimitedAxesSensorTypeToHandle( int32_t imuLimitedAxesSensorType) { switch (imuLimitedAxesSensorType) { case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: return '_ala'; case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES: return '_gla'; case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: return '_alc'; case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: return '_glc'; default: return 0; } } const char* LimitedAxesImuSensor::convertLimitedAxesSensorTypeToName( int32_t imuLimitedAxesSensorType) { switch (imuLimitedAxesSensorType) { case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: return "Accelerometer Limited Axes Sensor"; case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES: return "Gyroscope Limited Axes Sensor"; case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: return "Accelerometer Limited Axes Uncalibrated Sensor"; case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: return "Gyroscope Limited Axes Uncalibrated Sensor"; default: return ""; } } }; // namespace android