16736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare/* 2cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Copyright (C) 2015 Intel Corporation 36736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * 46736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * Licensed under the Apache License, Version 2.0 (the "License"); 56736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * you may not use this file except in compliance with the License. 66736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * You may obtain a copy of the License at 76736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * 86736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * http://www.apache.org/licenses/LICENSE-2.0 96736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * 106736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * Unless required by applicable law or agreed to in writing, software 116736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * distributed under the License is distributed on an "AS IS" BASIS, 126736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * See the License for the specific language governing permissions and 146736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare * limitations under the License. 156736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare */ 166736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 17cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include <string.h> 186736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare#include <cutils/log.h> 19cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include <stdexcept> 20cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include <errno.h> 21cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include <sys/epoll.h> 22cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include "SensorsHAL.hpp" 236736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 242260148caf820ec683166792851b504e036c1f39Constantin MuscaSensor * (*SensorContext::sensorFactoryFuncs[MAX_DEVICES])(int); 252260148caf820ec683166792851b504e036c1f39Constantin Muscastruct sensor_t SensorContext::sensorDescs[MAX_DEVICES]; 262260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::sensorsNum = 0; 27017e5df408ad372efd8897eb24575d69a824281eConstantin Muscaandroid::Mutex SensorContext::mutex; 286736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 292260148caf820ec683166792851b504e036c1f39Constantin MuscaSensorContext::SensorContext(const hw_module_t *module) { 302260148caf820ec683166792851b504e036c1f39Constantin Musca /* create the epoll fd used to register the incoming fds */ 312260148caf820ec683166792851b504e036c1f39Constantin Musca pollFd = epoll_create(MAX_DEVICES); 322260148caf820ec683166792851b504e036c1f39Constantin Musca if (pollFd == -1) { 332260148caf820ec683166792851b504e036c1f39Constantin Musca throw std::runtime_error("Failed to create poll file descriptor"); 342260148caf820ec683166792851b504e036c1f39Constantin Musca } 35cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 366736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare memset(&device, 0, sizeof(device)); 376736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 386736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.common.tag = HARDWARE_DEVICE_TAG; 396736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.common.version = SENSORS_DEVICE_API_VERSION_1_0; 406736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.common.module = const_cast<hw_module_t*>(module); 416736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.common.close = CloseWrapper; 426736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.activate = ActivateWrapper; 436736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.setDelay = SetDelayWrapper; 446736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.poll = PollEventsWrapper; 456736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.batch = BatchWrapper; 466736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare device.flush = FlushWrapper; 476736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 482260148caf820ec683166792851b504e036c1f39Constantin Musca memset(sensors, 0, sizeof(Sensor *) * MAX_DEVICES); 496736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 506736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 516736cffc42ac184d34234aa686f5952ca243fd46Bruce BeareSensorContext::~SensorContext() { 522260148caf820ec683166792851b504e036c1f39Constantin Musca int rc; 532260148caf820ec683166792851b504e036c1f39Constantin Musca 542260148caf820ec683166792851b504e036c1f39Constantin Musca for (int i = 0; i < sensorsNum; i++) { 55cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[i]) { 56cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca delete sensors[i]; 57cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca sensors[i] = nullptr; 58cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 596736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 602260148caf820ec683166792851b504e036c1f39Constantin Musca 612260148caf820ec683166792851b504e036c1f39Constantin Musca rc = close(pollFd); 622260148caf820ec683166792851b504e036c1f39Constantin Musca if (rc != 0) { 632260148caf820ec683166792851b504e036c1f39Constantin Musca ALOGE("Cannot close poll file descriptor"); 642260148caf820ec683166792851b504e036c1f39Constantin Musca } 652260148caf820ec683166792851b504e036c1f39Constantin Musca} 662260148caf820ec683166792851b504e036c1f39Constantin Musca 672260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::addSensorModule(struct sensor_t *sensorDesc, 682260148caf820ec683166792851b504e036c1f39Constantin Musca Sensor * (*sensorFactoryFunc)(int)) { 69017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 70017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 712260148caf820ec683166792851b504e036c1f39Constantin Musca if ((sensorDesc == nullptr) || (sensorFactoryFunc == nullptr)) { 722260148caf820ec683166792851b504e036c1f39Constantin Musca ALOGE("%s: cannot add a null sensor", __func__); 732260148caf820ec683166792851b504e036c1f39Constantin Musca return -EINVAL; 742260148caf820ec683166792851b504e036c1f39Constantin Musca } 752260148caf820ec683166792851b504e036c1f39Constantin Musca 762260148caf820ec683166792851b504e036c1f39Constantin Musca if (sensorsNum >= MAX_DEVICES) { 772260148caf820ec683166792851b504e036c1f39Constantin Musca ALOGE("%s: Cannot add more than %d sensors.", __func__, MAX_DEVICES); 782260148caf820ec683166792851b504e036c1f39Constantin Musca return -E2BIG; 792260148caf820ec683166792851b504e036c1f39Constantin Musca } 802260148caf820ec683166792851b504e036c1f39Constantin Musca 812260148caf820ec683166792851b504e036c1f39Constantin Musca sensorDesc->handle = sensorsNum; 822260148caf820ec683166792851b504e036c1f39Constantin Musca sensorDescs[sensorsNum] = *sensorDesc; 832260148caf820ec683166792851b504e036c1f39Constantin Musca sensorFactoryFuncs[sensorsNum] = sensorFactoryFunc; 842260148caf820ec683166792851b504e036c1f39Constantin Musca sensorsNum++; 852260148caf820ec683166792851b504e036c1f39Constantin Musca 862260148caf820ec683166792851b504e036c1f39Constantin Musca return 0; 872260148caf820ec683166792851b504e036c1f39Constantin Musca} 882260148caf820ec683166792851b504e036c1f39Constantin Musca 892260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::OpenWrapper(const struct hw_module_t *module, 902260148caf820ec683166792851b504e036c1f39Constantin Musca const char* id, struct hw_device_t **device) { 912260148caf820ec683166792851b504e036c1f39Constantin Musca SensorContext *ctx; 922260148caf820ec683166792851b504e036c1f39Constantin Musca 932260148caf820ec683166792851b504e036c1f39Constantin Musca try { 942260148caf820ec683166792851b504e036c1f39Constantin Musca ctx = new SensorContext(module); 952260148caf820ec683166792851b504e036c1f39Constantin Musca } catch (const std::runtime_error& e) { 962260148caf820ec683166792851b504e036c1f39Constantin Musca ALOGE("%s: Failed to open sensors hal. Error message: %s", 972260148caf820ec683166792851b504e036c1f39Constantin Musca __func__, e.what()); 982260148caf820ec683166792851b504e036c1f39Constantin Musca return -1; 992260148caf820ec683166792851b504e036c1f39Constantin Musca } 1002260148caf820ec683166792851b504e036c1f39Constantin Musca 1012260148caf820ec683166792851b504e036c1f39Constantin Musca *device = &ctx->device.common; 1022260148caf820ec683166792851b504e036c1f39Constantin Musca 1032260148caf820ec683166792851b504e036c1f39Constantin Musca return 0; 1042260148caf820ec683166792851b504e036c1f39Constantin Musca} 1052260148caf820ec683166792851b504e036c1f39Constantin Musca 1062260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::GetSensorsListWrapper(struct sensors_module_t *module, 1072260148caf820ec683166792851b504e036c1f39Constantin Musca struct sensor_t const **list) { 108017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 109017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 1102260148caf820ec683166792851b504e036c1f39Constantin Musca if (!list || (sensorsNum == 0)) { 1112260148caf820ec683166792851b504e036c1f39Constantin Musca return 0; 1122260148caf820ec683166792851b504e036c1f39Constantin Musca } 1132260148caf820ec683166792851b504e036c1f39Constantin Musca 1142260148caf820ec683166792851b504e036c1f39Constantin Musca *list = sensorDescs; 1152260148caf820ec683166792851b504e036c1f39Constantin Musca return sensorsNum; 1166736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 1176736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 1186736cffc42ac184d34234aa686f5952ca243fd46Bruce Beareint SensorContext::activate(int handle, int enabled) { 119cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca int rc = 0; 1206736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 1216736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare if (enabled != 0 && enabled != 1) { 122e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca ALOGE("%s: Invalid parameter", __func__); 1236736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare return -EINVAL; 1246736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 1256736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 1262260148caf820ec683166792851b504e036c1f39Constantin Musca if (handle < 0 || handle >= sensorsNum) { 127cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 128cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 129cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 1306736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare try { 131cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (enabled) { 132cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] == nullptr) { 1332260148caf820ec683166792851b504e036c1f39Constantin Musca sensors[handle] = sensorFactoryFuncs[handle](pollFd); 134cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] == nullptr) { 135cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -1; 136cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 137cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca rc = sensors[handle]->activate(handle, enabled); 138e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca if (rc != 0) { 139e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca goto delete_sensor; 140e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca } 141cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } else { 142cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return 0; 143cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 144cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } else { 145cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] != nullptr) { 146cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca rc = sensors[handle]->activate(handle, enabled); 147cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca delete sensors[handle]; 148cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca sensors[handle] = nullptr; 149cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } else { 150cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return 0; 151cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 1526736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 153e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca 154cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return rc; 155e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca } catch (const std::exception& e) { 156e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca /* The upper layer doesn't expect exceptions. Catch them all. */ 157e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca ALOGE("%s: Failed to %s sensor %d. Error message: %s.", 158e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca __func__, enabled ? "activate" : "deactivate", handle, e.what()); 1596736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 160e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca 161e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Muscadelete_sensor: 162e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca if (sensors[handle] != nullptr) { 163e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca delete sensors[handle]; 164e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca sensors[handle] = nullptr; 165e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca } 166e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca 167e6ba455908df55be910d9a5a9f3d06713830c95cConstantin Musca return -1; 1686736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 1696736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 1706736cffc42ac184d34234aa686f5952ca243fd46Bruce Beareint SensorContext::setDelay(int handle, int64_t ns) { 1712260148caf820ec683166792851b504e036c1f39Constantin Musca if (handle < 0 || handle >= sensorsNum) { 172cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 173cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 174cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 175cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] == nullptr) { 176cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca ALOGE("%s: cannot set delay. sensor %d is not activated", __func__, handle); 177cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 178cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 179cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 1806736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare return sensors[handle]->setDelay(handle, ns); 1816736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 1826736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 1832260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::pollEvents(sensors_event_t *data, int count) { 184cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca int nfds, i; 185cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca struct epoll_event ev[MAX_DEVICES]; 1869178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca int returnedEvents = 0, sensorIndex = -1; 187cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 188cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca /* return only when at least one event is available */ 189cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca while(true) { 1902260148caf820ec683166792851b504e036c1f39Constantin Musca nfds = epoll_wait(pollFd, ev, MAX_DEVICES, -1); 1919178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca if (nfds < 0) { 1929178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca ALOGE("%s: epoll_wait returned an error: %d", __func__, errno); 1939178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca return nfds; 1949178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca } 1959178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca 19630688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban { // Autolock scope 19730688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban android::Mutex::Autolock autolock(mutex); 19830688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban for(i = 0; i < nfds && returnedEvents < count; i++) { 19930688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban if (ev[i].events == EPOLLIN) { 20030688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban sensorIndex = ev[i].data.u32; 20130688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban if ((sensorIndex < 0) || (sensorIndex > sensorsNum)) { 20230688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban ALOGE("%s: Invalid sensor index", __func__); 20330688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban return -1; 20430688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban } 20530688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban 20630688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban if (sensors[sensorIndex] == nullptr) { 20730688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban /* The sensor might have been deactivated by another thread */ 20830688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban continue; 20930688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban } 21030688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban 21130688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban /* 21230688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban * The read operation might fail if the data is read by another 21330688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban * pollEvents call executed by another thread. 21430688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban */ 21530688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban if (sensors[sensorIndex]->readOneEvent(data + returnedEvents)) { 21630688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban returnedEvents++; 21730688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban } 218cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 219cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 22030688bbe0fe1b07407c033d07ed7e3d49a9fb22cMihai Serban } // Autolock scope 221017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 2229178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca if (returnedEvents > 0) { 2239178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca return returnedEvents; 2246736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 2256736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare } 2266736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2276736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2286736cffc42ac184d34234aa686f5952ca243fd46Bruce Beareint SensorContext::batch(int handle, int flags, 2296736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare int64_t period_ns, int64_t timeout) { 2302260148caf820ec683166792851b504e036c1f39Constantin Musca if (handle < 0 || handle >= sensorsNum) { 231cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 232cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 233cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 234cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] == nullptr) { 235cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca ALOGE("%s: cannot set delay. sensor %d is not activated", __func__, handle); 236cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 237cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 238cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 2396736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare return sensors[handle]->batch(handle, flags, period_ns, timeout); 2406736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2416736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2426736cffc42ac184d34234aa686f5952ca243fd46Bruce Beareint SensorContext::flush(int handle) { 2432260148caf820ec683166792851b504e036c1f39Constantin Musca if (handle < 0 || handle >= sensorsNum) { 244cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 245cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 246cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 247cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensors[handle] == nullptr) { 248cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca ALOGE("%s: cannot set delay. sensor %d is not activated", __func__, handle); 249cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 250cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 251cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 252cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca /* flush doesn't apply to one-shot sensors */ 2532260148caf820ec683166792851b504e036c1f39Constantin Musca if (sensorDescs[handle].flags & SENSOR_FLAG_ONE_SHOT_MODE) 254cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -EINVAL; 255cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 2566736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare return sensors[handle]->flush(handle); 2576736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2586736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2592260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::CloseWrapper(hw_device_t *dev) { 2602260148caf820ec683166792851b504e036c1f39Constantin Musca SensorContext *sensorContext = reinterpret_cast<SensorContext *>(dev); 261017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 262cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 263cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (sensorContext != nullptr) { 264cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca delete sensorContext; 265cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 266cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 2676736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare return 0; 2686736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2696736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2702260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::ActivateWrapper(sensors_poll_device_t *dev, 2716736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare int handle, int enabled) { 272017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 273017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 2742260148caf820ec683166792851b504e036c1f39Constantin Musca return reinterpret_cast<SensorContext *>(dev)->activate(handle, enabled); 2756736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2766736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2772260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::SetDelayWrapper(sensors_poll_device_t *dev, 2786736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare int handle, int64_t ns) { 279017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 280017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 2812260148caf820ec683166792851b504e036c1f39Constantin Musca return reinterpret_cast<SensorContext *>(dev)->setDelay(handle, ns); 2826736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2836736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2842260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::PollEventsWrapper(sensors_poll_device_t *dev, 2852260148caf820ec683166792851b504e036c1f39Constantin Musca sensors_event_t *data, int count) { 2862260148caf820ec683166792851b504e036c1f39Constantin Musca return reinterpret_cast<SensorContext *>(dev)->pollEvents(data, count); 2876736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2886736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2892260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::BatchWrapper(sensors_poll_device_1_t *dev, int handle, 2906736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare int flags, int64_t period_ns, int64_t timeout) { 291017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 292017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 2932260148caf820ec683166792851b504e036c1f39Constantin Musca return reinterpret_cast<SensorContext *>(dev)->batch(handle, flags, period_ns, 2946736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare timeout); 2956736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 2966736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 2972260148caf820ec683166792851b504e036c1f39Constantin Muscaint SensorContext::FlushWrapper(sensors_poll_device_1_t *dev, 2986736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare int handle) { 299017e5df408ad372efd8897eb24575d69a824281eConstantin Musca android::Mutex::Autolock autolock(mutex); 300017e5df408ad372efd8897eb24575d69a824281eConstantin Musca 3012260148caf820ec683166792851b504e036c1f39Constantin Musca return reinterpret_cast<SensorContext *>(dev)->flush(handle); 3026736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare} 3036736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 3046736cffc42ac184d34234aa686f5952ca243fd46Bruce Bearestatic struct hw_module_methods_t sensors_module_methods = { 3056134630c71b16746935fe284c64dc29014a89577Bruce Beare .open = SensorContext::OpenWrapper, 3066736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare}; 3076736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare 3086736cffc42ac184d34234aa686f5952ca243fd46Bruce Bearestruct sensors_module_t HAL_MODULE_INFO_SYM = { 3096134630c71b16746935fe284c64dc29014a89577Bruce Beare .common = { 3106134630c71b16746935fe284c64dc29014a89577Bruce Beare .tag = HARDWARE_MODULE_TAG, 3116134630c71b16746935fe284c64dc29014a89577Bruce Beare .version_major = 1, 3126134630c71b16746935fe284c64dc29014a89577Bruce Beare .version_minor = 0, 3136134630c71b16746935fe284c64dc29014a89577Bruce Beare .id = SENSORS_HARDWARE_MODULE_ID, 3146134630c71b16746935fe284c64dc29014a89577Bruce Beare .name = "Edison Sensor HAL", 3156134630c71b16746935fe284c64dc29014a89577Bruce Beare .author = "Intel", 3166134630c71b16746935fe284c64dc29014a89577Bruce Beare .methods = &sensors_module_methods, 3176134630c71b16746935fe284c64dc29014a89577Bruce Beare .dso = nullptr, 3186134630c71b16746935fe284c64dc29014a89577Bruce Beare .reserved = {0}, 3196736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare }, 3206134630c71b16746935fe284c64dc29014a89577Bruce Beare .get_sensors_list = SensorContext::GetSensorsListWrapper, 3216134630c71b16746935fe284c64dc29014a89577Bruce Beare .set_operation_mode = nullptr 3226736cffc42ac184d34234aa686f5952ca243fd46Bruce Beare}; 323