/*
 * Copyright (C) 2008-2014 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.
 */

#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/input.h>
#include <math.h>
#include <poll.h>
#include <string.h>
#include <sys/select.h>
#include <unistd.h>

#include <cutils/log.h>

#include "SensorBase.h"

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

#undef LOG_TAG
#define LOG_TAG "CwMcuSensor"

SensorBase::SensorBase(
        const char* dev_name,
        const char* data_name)
    : dev_name(dev_name)
    , data_name(data_name)
    , dev_fd(-1)
    , data_fd(-1)
{
}

SensorBase::~SensorBase() {
    if (data_fd >= 0) {
        close(data_fd);
    }
    if (dev_fd >= 0) {
        close(dev_fd);
    }
}

int SensorBase::open_device() {
    if (dev_fd<0 && dev_name) {
        dev_fd = open(dev_name, O_RDONLY);
        ALOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
    }
    return 0;
}

int SensorBase::close_device() {
    if (dev_fd >= 0) {
        close(dev_fd);
        dev_fd = -1;
    }
    return 0;
}

int SensorBase::write_sys_attribute(
        const char *path, const char *value, int bytes)
{
    int fd, amt;

    fd = open(path, O_WRONLY);
    if (fd < 0) {
        ALOGE("SensorBase: write_attr failed to open %s (%s)",
                path, strerror(errno));
        return -1;
    }

    amt = write(fd, value, bytes);
    amt = ((amt == -1) ? -errno : 0);
    ALOGE_IF(amt < 0, "SensorBase: write_int failed to write %s (%s)",
                path, strerror(errno));
    close(fd);
    return amt;
}

int SensorBase::getFd() const {
    if (!data_name) {
        return dev_fd;
    }
    return data_fd;
}

int SensorBase::setDelay(int32_t, int64_t) {
    return 0;
}

int64_t SensorBase::getDelay(int32_t) {
    return 0;
}

bool SensorBase::hasPendingEvents() const {
    return false;
}

int64_t SensorBase::getTimestamp() {
    struct timespec t;
    t.tv_sec = t.tv_nsec = 0;
    clock_gettime(CLOCK_BOOTTIME, &t);
    return int64_t(t.tv_sec)*NS_PER_SEC + t.tv_nsec;
}