blob: 2f91479b38bba2aee57e41027193abf5bf48c265 [file] [log] [blame]
/*
* 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