/*
* Copyright (C) 2017 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 "DynamicSensorManager.h"
#include "sensors.h"
#include <cutils/properties.h>
#include <media/stagefright/foundation/ADebug.h>
#include <utils/Log.h>
#include <errno.h>
#include <string.h>
using namespace android;
////////////////////////////////////////////////////////////////////////////////
SensorContext::SensorContext(const struct hw_module_t *module) {
memset(&device, 0, sizeof(device));
device.common.tag = HARDWARE_DEVICE_TAG;
device.common.version = SENSORS_DEVICE_API_VERSION_1_3;
device.common.module = const_cast<hw_module_t *>(module);
device.common.close = CloseWrapper;
device.activate = ActivateWrapper;
device.setDelay = SetDelayWrapper;
device.poll = PollWrapper;
device.batch = BatchWrapper;
device.flush = FlushWrapper;
// initialize dynamic sensor manager
int32_t base = property_get_int32("sensor.dynamic_sensor_hal.handle_base", kDynamicHandleBase);
int32_t count =
property_get_int32("sensor.dynamic_sensor_hal.handle_count", kMaxDynamicHandleCount);
mDynamicSensorManager.reset(DynamicSensorManager::createInstance(base, count, nullptr));
}
int SensorContext::close() {
delete this;
return 0;
}
int SensorContext::activate(int handle, int enabled) {
return mDynamicSensorManager->activate(handle, enabled);
}
int SensorContext::setDelay(int handle, int64_t delayNs) {
return mDynamicSensorManager->setDelay(handle, delayNs);
}
int SensorContext::poll(sensors_event_t *data, int count) {
return mDynamicSensorManager->poll(data, count);
}
int SensorContext::batch(
int handle,
int64_t sampling_period_ns,
int64_t max_report_latency_ns) {
return mDynamicSensorManager->batch(handle, sampling_period_ns, max_report_latency_ns);
}
int SensorContext::flush(int handle) {
return mDynamicSensorManager->flush(handle);
}
// static
int SensorContext::CloseWrapper(struct hw_device_t *dev) {
return reinterpret_cast<SensorContext *>(dev)->close();
}
// static
int SensorContext::ActivateWrapper(
struct sensors_poll_device_t *dev, int handle, int enabled) {
return reinterpret_cast<SensorContext *>(dev)->activate(handle, enabled);
}
// static
int SensorContext::SetDelayWrapper(
struct sensors_poll_device_t *dev, int handle, int64_t delayNs) {
return reinterpret_cast<SensorContext *>(dev)->setDelay(handle, delayNs);
}
// static
int SensorContext::PollWrapper(
struct sensors_poll_device_t *dev, sensors_event_t *data, int count) {
return reinterpret_cast<SensorContext *>(dev)->poll(data, count);
}
// static
int SensorContext::BatchWrapper(
struct sensors_poll_device_1 *dev,
int handle,
int flags,
int64_t sampling_period_ns,
int64_t max_report_latency_ns) {
(void) flags;
return reinterpret_cast<SensorContext *>(dev)->batch(
handle, sampling_period_ns, max_report_latency_ns);
}
// static
int SensorContext::FlushWrapper(struct sensors_poll_device_1 *dev, int handle) {
return reinterpret_cast<SensorContext *>(dev)->flush(handle);
}
size_t SensorContext::getSensorList(sensor_t const **list) {
*list = &(mDynamicSensorManager->getDynamicMetaSensor());
return 1;
}
////////////////////////////////////////////////////////////////////////////////
static sensor_t const *sensor_list;
static int open_sensors(
const struct hw_module_t *module,
const char *,
struct hw_device_t **dev) {
SensorContext *ctx = new SensorContext(module);
ctx->getSensorList(&sensor_list);
*dev = &ctx->device.common;
return 0;
}
static struct hw_module_methods_t sensors_module_methods = {
.open = open_sensors
};
static int get_sensors_list(
struct sensors_module_t *,
struct sensor_t const **list) {
*list = sensor_list;
return 1;
}
static int set_operation_mode(unsigned int mode) {
return (mode) ? -EINVAL : 0;
}
struct sensors_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = SENSORS_HARDWARE_MODULE_ID,
.name = "Google Dynamic Sensor Manager",
.author = "Google",
.methods = &sensors_module_methods,
.dso = NULL,
.reserved = {0},
},
.get_sensors_list = get_sensors_list,
.set_operation_mode = set_operation_mode,
};