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#define LOG_NDEBUG 0 1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdint.h> 2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h> 2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <unistd.h> 2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <poll.h> 2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/cdefs.h> 2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/types.h> 2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <linux/input.h> 2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <cutils/log.h> 3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "InputEventReader.h" 3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/ 3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowstruct input_event; 3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3749ea3e26ca3c6a779e527a0322e49a663333350aRosa ChowInputEventCircularReader::InputEventCircularReader(size_t numEvents) 3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : mBuffer(new input_event[numEvents * 2]), 3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mBufferEnd(mBuffer + numEvents), 4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mHead(mBuffer), 4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mCurr(mBuffer), 4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mFreeSpace(numEvents) 4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mLastFd = -1; 4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 4749ea3e26ca3c6a779e527a0322e49a663333350aRosa ChowInputEventCircularReader::~InputEventCircularReader() 4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow delete [] mBuffer; 5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INPUT_EVENT_DEBUG (0) 5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowssize_t InputEventCircularReader::fill(int fd) 5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow size_t numEventsRead = 0; 5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mLastFd = fd; 5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(INPUT_EVENT_DEBUG, 5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd); 6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (mFreeSpace) { 6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event)); 6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (nread < 0 || nread % sizeof(input_event)) { 6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow //LOGE("Partial event received nread=%d, required=%d", 6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow // nread, sizeof(input_event)); 6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow //LOGE("FD trying to read is: %d"); 6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow // we got a partial event!! 6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (INPUT_EVENT_DEBUG) { 6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n", 6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __PRETTY_FUNCTION__); 7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(nread % sizeof(input_event), 7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow "DEBUG:%s exit nread %% sizeof(input_event)\n", 7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __PRETTY_FUNCTION__); 7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return (nread < 0 ? -errno : -EINVAL); 7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow numEventsRead = nread / sizeof(input_event); 7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (numEventsRead) { 7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mHead += numEventsRead; 8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mFreeSpace -= numEventsRead; 8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (mHead > mBufferEnd) { 8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow size_t s = mHead - mBufferEnd; 8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow memcpy(mBuffer, mBufferEnd, s * sizeof(input_event)); 8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mHead = mBuffer + s; 8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit, numEventsRead:%d\n", 9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __PRETTY_FUNCTION__, numEventsRead); 9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return numEventsRead; 9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowssize_t InputEventCircularReader::readEvent(input_event const** events) 9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *events = mCurr; 9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s fd:%d, available:%d\n", 9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __PRETTY_FUNCTION__, mLastFd, (int)available); 10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return (available ? 1 : 0); 10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowvoid InputEventCircularReader::next() 10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mCurr++; 10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mFreeSpace++; 10749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (mCurr >= mBufferEnd) { 10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow mCurr = mBuffer; 10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s fd:%d, still available:%d\n", 11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __PRETTY_FUNCTION__, mLastFd, (int)available); 11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 115