/* * 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, };