/*
* Copyright (C) 2015 Intel Corp
*
* 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 ANDROID_SENSOR_BASE_H
#define ANDROID_SENSOR_BASE_H

#include <stdint.h>
#include <errno.h>
#include <sys/cdefs.h>
#include <sys/types.h>

#if ANDROID_VERSION >= 5
/* #warning "build for Wear" */
#define LOGV_IF ALOGV_IF
#define LOGE_IF ALOGE_IF
#define LOGI_IF ALOGI_IF
#define LOGI    ALOGI
#define LOGE    ALOGE
#define LOGV    ALOGV
#define LOGW    ALOGW
#else
#warning "build for ICS or earlier version"
#endif

/* Log enablers, each of these independent */

/* TODO: clear all logging below on production build, keep it during integration */
#define PROCESS_VERBOSE (1) /* process log messages */
#define EXTRA_VERBOSE   (1) /* verbose log messages */
#define SYSFS_VERBOSE   (1) /* log sysfs interactions as cat/echo for repro
                               purpose on a shell */
#define FUNC_ENTRY      (1) /* log entry in all one-time functions */

/* Note that enabling this logs may affect performance */
#define HANDLER_ENTRY   (1) /* log entry in all handler functions */
#define ENG_VERBOSE     (1) /* log some a lot more info about the internals */
#define INPUT_DATA      (1) /* log the data input from the events */
#define HANDLER_DATA    (1) /* log the data fetched from the handlers */

#define FUNC_LOG \
            LOGV("%s (hardware/intel/sensors/als)", __PRETTY_FUNCTION__)
#define VFUNC_LOG \
            LOGV_IF(FUNC_ENTRY, "Entering function '%s' (hardware/intel/sensors/als)", __PRETTY_FUNCTION__)
#define VHANDLER_LOG \
            LOGV_IF(HANDLER_ENTRY, "Entering handler '%s' (hardware/intel/sensors/als)", __PRETTY_FUNCTION__)
#define CALL_MEMBER_FN(pobject, ptrToMember) ((pobject)->*(ptrToMember))

#define MAX_SYSFS_NAME_LEN  (100)
#define IIO_BUFFER_LENGTH   (480)

/*****************************************************************************/

struct sensors_event_t;

class SensorBase {
protected:
    const char *dev_name;
    const char *data_name;
    int dev_fd;
    int data_fd;

    int openInput(const char* inputName);
    static int64_t getTimestamp();
    static int64_t timevalToNano(timeval const& t) {
        return t.tv_sec * 1000000000LL + t.tv_usec * 1000;
    }

    int open_device();
    int close_device();

public:
            SensorBase(const char* dev_name, const char* data_name);

    virtual ~SensorBase();

    virtual int readEvents(sensors_event_t* data, int count) = 0;
    virtual bool hasPendingEvents() const;
    virtual int getFd() const;
    virtual int setDelay(int32_t handle, int64_t ns);
    virtual int enable(int32_t handle, int enabled);
    virtual int isActivated(int handle);
#ifdef HAL_VERSION_GT_1_0
    virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
#endif
};

/*****************************************************************************/

#endif  // ANDROID_SENSOR_BASE_H
