1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*
2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Copyright (C) 2008 The Android Open Source Project
3ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
4ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Licensed under the Apache License, Version 2.0 (the "License");
5ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * you may not use this file except in compliance with the License.
6ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * You may obtain a copy of the License at
7ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
8ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *      http://www.apache.org/licenses/LICENSE-2.0
9ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
10ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Unless required by applicable law or agreed to in writing, software
11ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * distributed under the License is distributed on an "AS IS" BASIS,
12ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * See the License for the specific language governing permissions and
14ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * limitations under the License.
15ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
16ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
17ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <fcntl.h>
18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <errno.h>
19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <math.h>
20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <poll.h>
21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <unistd.h>
22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <dirent.h>
23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <sys/select.h>
24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <cutils/log.h>
25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AdxlSensor.h"
27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ADXL_DATA_NAME				"ADXL34x accelerometer"
29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ADXL_MAX_SAMPLE_RATE_VAL	11 /* 200 Hz */
30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ADXL_UNIT_CONVERSION(value) ((value) * GRAVITY_EARTH / (256.0f))
32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi MasudaAdxlSensor::AdxlSensor()
36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    : SensorBase(NULL, ADXL_DATA_NAME),
37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda      mEnabled(0),
38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda      mDelay(-1),
39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda      mInputReader(4),
40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda      mHasPendingEvent(false)
41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPendingEvent.version = sizeof(sensors_event_t);
43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPendingEvent.sensor = ID_A;
44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPendingEvent.type = SENSOR_TYPE_ACCELEROMETER;
45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data));
46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (data_fd >= 0) {
48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        strcpy(input_sysfs_path, "/sys/class/input/");
49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        strcat(input_sysfs_path, input_name);
50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        strcat(input_sysfs_path, "/device/device/");
51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        input_sysfs_path_len = strlen(input_sysfs_path);
52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGD("AdxlSensor: sysfs_path=%s", input_sysfs_path);
53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    } else {
54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		input_sysfs_path[0] = '\0';
55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		input_sysfs_path_len = 0;
56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi MasudaAdxlSensor::~AdxlSensor() {
60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (mEnabled) {
61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        setEnable(0, 0);
62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AdxlSensor::setInitialState() {
66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    struct input_absinfo absinfo;
67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (mEnabled) {
69ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    	if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X), &absinfo)) {
70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mPendingEvent.acceleration.x = ADXL_UNIT_CONVERSION(absinfo.value);
71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    	if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {
73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mPendingEvent.acceleration.y = ADXL_UNIT_CONVERSION(absinfo.value);
74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
75ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {
76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mPendingEvent.acceleration.z = ADXL_UNIT_CONVERSION(absinfo.value);
77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return 0;
80ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudabool AdxlSensor::hasPendingEvents() const {
83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return mHasPendingEvent;
84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AdxlSensor::setEnable(int32_t handle, int enabled) {
87ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int err = 0;
88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	char buffer[2];
89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	/* handle check */
91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (handle != ID_A) {
92ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("AdxlSensor: Invalid handle (%d)", handle);
93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return -EINVAL;
94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buffer[0] = '\0';
97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buffer[1] = '\0';
98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (mEnabled <= 0) {
100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if(enabled) buffer[0] = '0';
101ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else if (mEnabled == 1) {
102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if(!enabled) buffer[0] = '1';
103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (buffer[0] != '\0') {
105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        strcpy(&input_sysfs_path[input_sysfs_path_len], "disable");
106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		err = write_sys_attribute(input_sysfs_path, buffer, 1);
107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (err != 0) {
108ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return err;
109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGD("AdxlSensor: Control set %s", buffer);
111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda   		setInitialState();
112ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
113ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
114ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (enabled) {
115ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		mEnabled++;
116ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (mEnabled > 32767) mEnabled = 32767;
117ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else {
118ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		mEnabled--;
119ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (mEnabled < 0) mEnabled = 0;
120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
121ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	ALOGD("AdxlSensor: mEnabled = %d", mEnabled);
122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return err;
124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AdxlSensor::setDelay(int32_t handle, int64_t delay_ns)
127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int err = 0;
129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int rate_val;
130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int32_t us;
131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	char buffer[16];
132ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int bytes;
133ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
134ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	/* handle check */
135ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (handle != ID_A) {
136ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("AdxlSensor: Invalid handle (%d)", handle);
137ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return -EINVAL;
138ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
139ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
140ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (mDelay != delay_ns) {
141ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		/*
142ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	 	* The ADXL34x Supports 16 sample rates ranging from 3200Hz-0.098Hz
143ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	 	* Calculate best fit and limit to max 200Hz (rate_val 11)
144ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	 	*/
145ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
146ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		us = (int32_t)(delay_ns / 1000);
147ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		for (rate_val = 0; rate_val < 16; rate_val++)
148ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			if (us  >= ((10000000) >> rate_val))
149ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				break;
150ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
151ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (rate_val > ADXL_MAX_SAMPLE_RATE_VAL) {
152ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			rate_val = ADXL_MAX_SAMPLE_RATE_VAL;
153ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
154ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
155ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    	strcpy(&input_sysfs_path[input_sysfs_path_len], "rate");
156ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda   		bytes = sprintf(buffer, "%d", rate_val);
157ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		err = write_sys_attribute(input_sysfs_path, buffer, bytes);
158ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (err == 0) {
159ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mDelay = delay_ns;
160ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			ALOGD("AdxlSensor: Control set delay %f ms requetsed, using %f ms",
161ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				delay_ns/1000000.0f, 1e6 / (3200000 >> (15 - rate_val)));
162ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
163ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
164ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
165ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return err;
166ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
167ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
168ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint64_t AdxlSensor::getDelay(int32_t handle)
169ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
170ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return (handle == ID_A) ? mDelay : 0;
171ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
172ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
173ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AdxlSensor::getEnable(int32_t handle)
174ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
175ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return (handle == ID_A) ? mEnabled : 0;
176ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
177ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
178ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AdxlSensor::readEvents(sensors_event_t* data, int count)
179ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
180ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (count < 1)
181ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        return -EINVAL;
182ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
183ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (mHasPendingEvent) {
184ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        mHasPendingEvent = false;
185ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        mPendingEvent.timestamp = getTimestamp();
186ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        *data = mPendingEvent;
187ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        return mEnabled ? 1 : 0;
188ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
189ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
190ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    ssize_t n = mInputReader.fill(data_fd);
191ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (n < 0)
192ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        return n;
193ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
194ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int numEventReceived = 0;
195ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    input_event const* event;
196ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
197ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    while (count && mInputReader.readEvent(&event)) {
198ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        int type = event->type;
199ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        if (type == EV_ABS) {
200ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            float value = event->value;
201ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            if (event->code == EVENT_TYPE_ACCEL_X) {
202ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                mPendingEvent.acceleration.x = ADXL_UNIT_CONVERSION(value);
203ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            } else if (event->code == EVENT_TYPE_ACCEL_Y) {
204ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                mPendingEvent.acceleration.y = ADXL_UNIT_CONVERSION(value);
205ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            } else if (event->code == EVENT_TYPE_ACCEL_Z) {
206ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                mPendingEvent.acceleration.z = ADXL_UNIT_CONVERSION(value);
207ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            }
208ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        } else if (type == EV_SYN) {
209ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            mPendingEvent.timestamp = timevalToNano(event->time);
210ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            if (mEnabled) {
211ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                *data++ = mPendingEvent;
212ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                count--;
213ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                numEventReceived++;
214ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            }
215ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        } else {
216ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            ALOGE("AdxlSensor: unknown event (type=%d, code=%d)",
217ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                    type, event->code);
218ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        }
219ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        mInputReader.next();
220ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
221ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
222ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return numEventReceived;
223ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
224ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
225