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