157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu/* 257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * Copyright (C) 2017 The Android Open Source Project 357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * 457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * Licensed under the Apache License, Version 2.0 (the "License"); 557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * you may not use this file except in compliance with the License. 657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * You may obtain a copy of the License at 757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * 857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * http://www.apache.org/licenses/LICENSE-2.0 957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * 1057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * Unless required by applicable law or agreed to in writing, software 1157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * distributed under the License is distributed on an "AS IS" BASIS, 1257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * See the License for the specific language governing permissions and 1457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu * limitations under the License. 1557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu */ 1657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 1757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#ifndef ANDROID_SENSORHAL_EXT_DYNAMIC_SENSOR_MANAGER_H 1857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#define ANDROID_SENSORHAL_EXT_DYNAMIC_SENSOR_MANAGER_H 1957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 2057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include "SensorEventCallback.h" 2157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include "RingBuffer.h" 2257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <hardware/sensors.h> 2357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <utils/RefBase.h> 2457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 2557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <mutex> 2657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <string> 2757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <unordered_map> 2857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#include <vector> 2957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 3057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xunamespace android { 3157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xunamespace SensorHalExt { 3257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 3357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xuclass BaseDynamicSensorDaemon; 3457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 3557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xuclass DynamicSensorManager : public SensorEventCallback { 3657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xupublic: 3757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // handleBase is reserved for the dynamic sensor meta sensor. 3857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // handleMax must be greater than handleBase + 1. 3957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // This class has two operation mode depending on callback: 1) extension, 2) stand-alone. 4057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // In extension mode, callback must not be nullptr. Sensor event generated will be submitted to 4157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // buffer of primary sensor HAL implementation. In stand-alone mode, callback must be nullptr. 4257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // Generated sensor events will be added into internal buffer waiting for poll() function to 4357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // pick up. 4457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // 4557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu static DynamicSensorManager* createInstance( 4657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int handleBase, int handleCount, SensorEventCallback *callback); 4757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu virtual ~DynamicSensorManager(); 4857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 4957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // calls to add or remove sensor, called from sensor daemon 5057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu bool registerSensor(sp<BaseSensorObject> sensor); 5157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu void unregisterSensor(sp<BaseSensorObject> sensor); 5257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 5357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // Determine if a sensor handle is in the range defined in constructor. 5457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // It does not test if sensor handle is valid. 5557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu bool owns(int handle) const; 5657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 5757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // handles sensor hal requests. 5857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int activate(int handle, bool enable); 5957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int batch(int handle, nsecs_t sample_period, nsecs_t batch_period); 6057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int setDelay(int handle, nsecs_t sample_period); 6157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int flush(int handle); 6257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int poll(sensors_event_t * data, int count); 6357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 6457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // SensorEventCallback 6557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu virtual int submitEvent(sp<BaseSensorObject>, const sensors_event_t &e) override; 6657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 6757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // get meta sensor struct 6857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu const sensor_t& getDynamicMetaSensor() const; 6957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xuprotected: 7057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu DynamicSensorManager(int handleBase, int handleMax, SensorEventCallback* callback); 7157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xuprivate: 7257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // a helper class used for generate connection and disconnection report 7357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu class ConnectionReport { 7457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu public: 7557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu ConnectionReport() {} 7657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu ConnectionReport(int handle, sp<BaseSensorObject> sensor); 7757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu ~ConnectionReport(); 7857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu const sensors_event_t& generateConnectionEvent(int metaHandle); 7957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu static void fillDisconnectionEvent(sensors_event_t* event, int metaHandle, int handle); 8057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu private: 8157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu sensor_t mSensor; 8257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::string mName; 8357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::string mVendor; 8457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::string mPermission; 8557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::string mStringType; 8657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu sensors_event_t mEvent; 8757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu uint8_t mUuid[16]; 8857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu bool mGenerated; 8957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu DISALLOW_EVIL_CONSTRUCTORS(ConnectionReport); 9057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu }; 9157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 9257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // returns next available handle to use upon a new sensor connection, or -1 if we run out. 9357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int getNextAvailableHandle(); 9457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 9557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // TF: int foo(sp<BaseSensorObject> obj); 9657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu template <typename TF> 9757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int operateSensor(int handle, TF f) const { 9857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::lock_guard<std::mutex> lk(mLock); 9957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu const auto i = mMap.find(handle); 10057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu if (i == mMap.end()) { 10157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu return BAD_VALUE; 10257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu } 10357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu sp<BaseSensorObject> s = i->second.promote(); 10457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu if (s == nullptr) { 10557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // sensor object is already gone 10657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu return BAD_VALUE; 10757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu } 10857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu return f(s); 10957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu } 11057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 11157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // available sensor handle space 11257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu const std::pair<int, int> mHandleRange; 11357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu sensor_t mMetaSensor; 11457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 11557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // immutable pointer to event callback, used in extention mode. 11657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu SensorEventCallback * const mCallback; 11757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 11857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // RingBuffer used in standalone mode 11957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu static constexpr size_t kFifoSize = 4096; //4K events 12057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu mutable std::mutex mFifoLock; 12157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu RingBuffer mFifo; 12257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 12357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // mapping between handle and SensorObjects 12457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu mutable std::mutex mLock; 12557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu int mNextHandle; 1264715d1734d2c60cc91ef70d409678d8eda382fdePeng Xu std::unordered_map<int, wp<BaseSensorObject>> mMap; 12757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::unordered_map<void *, int> mReverseMap; 12857d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu mutable std::unordered_map<int, ConnectionReport> mPendingReport; 12957d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 13057d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu // daemons 13157d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu std::vector<sp<BaseDynamicSensorDaemon>> mDaemonVector; 13257d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu}; 13357d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 13457d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu} // namespace SensorHalExt 13557d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu} // namespace android 13657d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu 13757d8af7f5ecbdbadb043b05ac5874989ef33fdadPeng Xu#endif // ANDROID_SENSORHAL_EXT_DYNAMIC_SENSOR_MANAGER_H 138