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