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