149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*
249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Copyright (C) 2012 Invensense, Inc.
349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Licensed under the Apache License, Version 2.0 (the "License");
549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* you may not use this file except in compliance with the License.
649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* You may obtain a copy of the License at
749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*      http://www.apache.org/licenses/LICENSE-2.0
949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Unless required by applicable law or agreed to in writing, software
1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* distributed under the License is distributed on an "AS IS" BASIS,
1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* See the License for the specific language governing permissions and
1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* limitations under the License.
1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*/
1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef ANDROID_SENSOR_BASE_H
1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ANDROID_SENSOR_BASE_H
1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdint.h>
2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h>
2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/cdefs.h>
2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/types.h>
2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#if defined ANDROID_JELLYBEAN
2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow//build for Jellybean
2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGV_IF ALOGV_IF
2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGE_IF ALOGE_IF
2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGI_IF ALOGI_IF
3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGI    ALOGI
3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGE    ALOGE
3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGV    ALOGV
3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOGW    ALOGW
3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else
3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow//build for ICS or earlier version
3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define FUNC_LOG \
3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow            LOGV("%s", __PRETTY_FUNCTION__)
4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define VFUNC_LOG \
41cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro            LOGV_IF(SensorBase::FUNC_ENTRY, \
42cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro                    "Entering function '%s'", __PRETTY_FUNCTION__)
4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define VHANDLER_LOG \
44cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro            LOGV_IF(SensorBase::HANDLER_ENTRY, \
45cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro                    "Entering handler '%s'", __PRETTY_FUNCTION__)
4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define CALL_MEMBER_FN(pobject, ptrToMember) ((pobject)->*(ptrToMember))
4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_SYSFS_NAME_LEN  (100)
4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define IIO_BUFFER_LENGTH   (480)
5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/
5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowstruct sensors_event_t;
5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowclass SensorBase {
56cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaropublic:
57cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    /* Log enablers, each of these independent */
58cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool PROCESS_VERBOSE;   /* process log messages */
59cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool EXTRA_VERBOSE;     /* verbose log messages */
60cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool SYSFS_VERBOSE;     /* log sysfs interactions as cat/echo for
61cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro                                      repro purpose on a shell */
62cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    /* Note that enabling this logs may affect performance */
63cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool FUNC_ENTRY;        /* log entry in all one-time functions */
64cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool HANDLER_ENTRY;     /* log entry in all handler functions */
65cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool ENG_VERBOSE;       /* log a lot more info about the internals */
66cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool INPUT_DATA;        /* log the data input from the events */
67cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    static bool HANDLER_DATA;      /* log the data fetched from the handlers */
68cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro
6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowprotected:
7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    const char *dev_name;
7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    const char *data_name;
7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char input_name[PATH_MAX];
7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dev_fd;
7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int data_fd;
7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int openInput(const char* inputName);
7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    static int64_t getTimestamp();
7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    static int64_t timevalToNano(timeval const& t) {
7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return t.tv_sec * 1000000000LL + t.tv_usec * 1000;
8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int open_device();
8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int close_device();
8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowpublic:
8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    SensorBase(const char* dev_name, const char* data_name);
8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual ~SensorBase();
8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int readEvents(sensors_event_t* data, int count) = 0;
9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readSample(long *data, int64_t *timestamp);
9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readRawSample(float *data, int64_t *timestamp);
9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual bool hasPendingEvents() const;
9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getFd() const;
9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int setDelay(int32_t handle, int64_t ns);
9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int enable(int32_t handle, int enabled);
9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int query(int what, int* value);
9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
98cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    virtual int flush(int handle);
9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow};
10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/
10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif  // ANDROID_SENSOR_BASE_H
104