/*
 * 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.
 */

#ifndef A_SENSOR_EVENT_QUEUE_H_

#define A_SENSOR_EVENT_QUEUE_H_

#include <android/frameworks/sensorservice/1.0/IEventQueue.h>
#include <android/frameworks/sensorservice/1.0/IEventQueueCallback.h>
#include <android/looper.h>
#include <android/sensor.h>
#include <android-base/macros.h>
#include <sensors/convert.h>
#include <utils/Mutex.h>

#include <atomic>

struct ALooper;

struct ASensorEventQueue
    : public android::frameworks::sensorservice::V1_0::IEventQueueCallback {
    using Event = android::hardware::sensors::V1_0::Event;
    using IEventQueue = android::frameworks::sensorservice::V1_0::IEventQueue;

    ASensorEventQueue(
            ALooper *looper,
            ALooper_callbackFunc callback,
            void *data);

    android::hardware::Return<void> onEvent(const Event &event) override;

    void setImpl(const android::sp<IEventQueue> &queueImpl);

    int registerSensor(
            ASensorRef sensor,
            int32_t samplingPeriodUs,
            int64_t maxBatchReportLatencyUs);

    int enableSensor(ASensorRef sensor);
    int disableSensor(ASensorRef sensor);

    int setEventRate(ASensorRef sensor, int32_t samplingPeriodUs);

    int requestAdditionalInfoEvents(bool enable);

    ssize_t getEvents(ASensorEvent *events, size_t count);
    int hasEvents() const;

    void dispatchCallback();

    void invalidate();

private:
    ALooper *mLooper;
    ALooper_callbackFunc mCallback;
    void *mData;
    android::sp<IEventQueue> mQueueImpl;

    android::Mutex mLock;
    std::vector<sensors_event_t> mQueue;

    std::atomic_bool mRequestAdditionalInfo;
    android::Mutex mValidLock;
    bool mValid;

    DISALLOW_COPY_AND_ASSIGN(ASensorEventQueue);
};

#endif  // A_SENSOR_EVENT_QUEUE_H_

