135 lines
4.7 KiB
C++
135 lines
4.7 KiB
C++
/*
|
|
* 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 <math.h>
|
|
#include <stdint.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <utils/Errors.h>
|
|
|
|
#include <hardware/sensors.h>
|
|
|
|
#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
|