1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* Copyright (C) 2012 Invensense, Inc. 3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* 4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* Licensed under the Apache License, Version 2.0 (the "License"); 5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* you may not use this file except in compliance with the License. 6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* You may obtain a copy of the License at 7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* 8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* http://www.apache.org/licenses/LICENSE-2.0 9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* 10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* Unless required by applicable law or agreed to in writing, software 11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* distributed under the License is distributed on an "AS IS" BASIS, 12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* See the License for the specific language governing permissions and 14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* limitations under the License. 15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/ 16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOG_NDEBUG 0 18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdint.h> 20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h> 21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h> 22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <poll.h> 23980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin#include <string.h> 24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/cdefs.h> 26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/types.h> 27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/input.h> 29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <cutils/log.h> 31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "InputEventReader.h" 33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*****************************************************************************/ 35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct input_event; 37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick VaccaroInputEventCircularReader::InputEventCircularReader(size_t numEvents) 39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro : mBuffer(new input_event[numEvents * 2]), 40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mBufferEnd(mBuffer + numEvents), 41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mHead(mBuffer), 42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mCurr(mBuffer), 43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mFreeSpace(numEvents) 44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mLastFd = -1; 46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick VaccaroInputEventCircularReader::~InputEventCircularReader() 49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro delete [] mBuffer; 51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INPUT_EVENT_DEBUG (0) 54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarossize_t InputEventCircularReader::fill(int fd) 55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro size_t numEventsRead = 0; 57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mLastFd = fd; 58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(INPUT_EVENT_DEBUG, 60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd); 61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (mFreeSpace) { 62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event)); 63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (nread < 0 || nread % sizeof(input_event)) { 64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //LOGE("Partial event received nread=%d, required=%d", 65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // nread, sizeof(input_event)); 66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //LOGE("FD trying to read is: %d"); 67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // we got a partial event!! 68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (INPUT_EVENT_DEBUG) { 69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n", 70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro __PRETTY_FUNCTION__); 71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(nread % sizeof(input_event), 72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "DEBUG:%s exit nread %% sizeof(input_event)\n", 73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro __PRETTY_FUNCTION__); 74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return (nread < 0 ? -errno : -EINVAL); 76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro numEventsRead = nread / sizeof(input_event); 79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (numEventsRead) { 80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mHead += numEventsRead; 81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mFreeSpace -= numEventsRead; 82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (mHead > mBufferEnd) { 83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro size_t s = mHead - mBufferEnd; 84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro memcpy(mBuffer, mBufferEnd, s * sizeof(input_event)); 85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mHead = mBuffer + s; 86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit, numEventsRead:%d\n", 91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro __PRETTY_FUNCTION__, numEventsRead); 92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return numEventsRead; 93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarossize_t InputEventCircularReader::readEvent(input_event const** events) 96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *events = mCurr; 98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s fd:%d, available:%d\n", 100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro __PRETTY_FUNCTION__, mLastFd, (int)available); 101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return (available ? 1 : 0); 102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid InputEventCircularReader::next() 105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mCurr++; 107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mFreeSpace++; 108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (mCurr >= mBufferEnd) { 109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro mCurr = mBuffer; 110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s fd:%d, still available:%d\n", 113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro __PRETTY_FUNCTION__, mLastFd, (int)available); 114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 116