/*
* 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.
*/
#ifndef ANDROID_CWMCU_SENSOR_H
#define ANDROID_CWMCU_SENSOR_H
#include <errno.h>
#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <utils/BitSet.h>
#include "InputEventReader.h"
#include "sensors.h"
#include "SensorBase.h"
/*****************************************************************************/
// Must match driver copy of .../linux/include/linux/CwMcuSensor.h file
typedef enum {
CW_ACCELERATION = 0,
CW_MAGNETIC = 1,
CW_GYRO = 2,
CW_LIGHT = 3,
CW_PRESSURE = 5,
CW_ORIENTATION = 6,
CW_ROTATIONVECTOR = 7,
CW_LINEARACCELERATION = 8,
CW_GRAVITY = 9,
CW_MAGNETIC_UNCALIBRATED = 16,
CW_GYROSCOPE_UNCALIBRATED = 17,
CW_GAME_ROTATION_VECTOR = 18,
CW_GEOMAGNETIC_ROTATION_VECTOR = 19,
CW_SIGNIFICANT_MOTION = 20,
CW_STEP_DETECTOR = 21,
CW_STEP_COUNTER = 22,
HTC_ANY_MOTION = 28,
//Above are Firmware supported sensors,
CW_ACCELERATION_W = 32,
CW_MAGNETIC_W = 33,
CW_GYRO_W = 34,
CW_PRESSURE_W = 37,
CW_ORIENTATION_W = 38,
CW_ROTATIONVECTOR_W = 39,
CW_LINEARACCELERATION_W = 40,
CW_GRAVITY_W = 41,
HTC_WAKE_UP_GESTURE_W = 42,
CW_MAGNETIC_UNCALIBRATED_W = 48,
CW_GYROSCOPE_UNCALIBRATED_W = 49,
CW_GAME_ROTATION_VECTOR_W = 50,
CW_GEOMAGNETIC_ROTATION_VECTOR_W = 51,
CW_STEP_DETECTOR_W = 53,
CW_STEP_COUNTER_W = 54,
CW_SENSORS_ID_END,
TIME_DIFF_EXHAUSTED = 97,
CW_TIME_BASE = 98,
CW_META_DATA = 99,
CW_MAGNETIC_UNCALIBRATED_BIAS = 100,
CW_GYROSCOPE_UNCALIBRATED_BIAS = 101
} CW_SENSORS_ID;
#define SAVE_PATH_ACC "/data/misc/AccOffset.txt"
#define SAVE_PATH_MAG "/data/misc/cw_calibrator_mag.ini"
#define SAVE_PATH_GYRO "/data/system/cw_calibrator_gyro.ini"
#define BOOT_MODE_PATH "sys/class/htc_sensorhub/sensor_hub/boot_mode"
#define numSensors CW_SENSORS_ID_END
#define TIMESTAMP_SYNC_CODE (98)
#define PERIODIC_SYNC_TIME_SEC (5)
class CwMcuSensor : public SensorBase {
android::BitSet64 mEnabled;
InputEventCircularReader mInputReader;
sensors_event_t mPendingEvents[numSensors];
sensors_event_t mPendingEventsFlush;
android::BitSet64 mPendingMask;
char fixed_sysfs_path[PATH_MAX];
int fixed_sysfs_path_len;
float indexToValue(size_t index) const;
char mDevPath[PATH_MAX];
char mTriggerName[PATH_MAX];
float time_slope;
int64_t time_offset;
uint64_t last_mcu_sync_time;
uint64_t last_cpu_sync_time;
bool offset_reset[numSensors];
uint64_t last_mcu_timestamp[numSensors];
uint64_t last_cpu_timestamp[numSensors];
pthread_t sync_time_thread;
bool init_trigger_done;
int sysfs_set_input_attr(const char *attr, char *value, size_t len);
int sysfs_set_input_attr_by_int(const char *attr, int value);
public:
CwMcuSensor();
virtual ~CwMcuSensor();
virtual int readEvents(sensors_event_t* data, int count);
virtual bool hasPendingEvents() const;
virtual int setDelay(int32_t handle, int64_t ns);
virtual int setEnable(int32_t handle, int enabled);
virtual int getEnable(int32_t handle);
virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
virtual int flush(int handle);
bool is_batch_wake_sensor(int32_t handle);
int find_sensor(int32_t handle);
int find_handle(int32_t sensors_id);
void cw_save_calibrator_file(int type, const char * path, int* str);
int cw_read_calibrator_file(int type, const char * path, int* str);
int processEvent(uint8_t *event);
void calculate_rv_4th_element(int sensors_id);
void sync_time_thread_in_class(void);
};
/*****************************************************************************/
#endif // ANDROID_CWMCU_SENSOR_H