164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/* 264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Copyright (C) 2012 Invensense, Inc. 364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Licensed under the Apache License, Version 2.0 (the "License"); 564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* you may not use this file except in compliance with the License. 664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* You may obtain a copy of the License at 764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* http://www.apache.org/licenses/LICENSE-2.0 964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 1064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Unless required by applicable law or agreed to in writing, software 1164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* distributed under the License is distributed on an "AS IS" BASIS, 1264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* See the License for the specific language governing permissions and 1464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* limitations under the License. 1564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*/ 1664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 1764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define LOG_NDEBUG 0 1864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 1964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <stdint.h> 2064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <errno.h> 2164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <unistd.h> 2264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <poll.h> 2364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 2464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <sys/cdefs.h> 2564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <sys/types.h> 2664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 2764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <linux/input.h> 2864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 2964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <cutils/log.h> 3064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 3164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "InputEventReader.h" 3264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "local_log_def.h" 3364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 3464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/*****************************************************************************/ 3564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 3664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranstruct input_event; 3764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 3864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan RajeswaranInputEventCircularReader::InputEventCircularReader(size_t numEvents) 3964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran : mBuffer(new input_event[numEvents * 2]), 4064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mBufferEnd(mBuffer + numEvents), 4164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mHead(mBuffer), 4264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mCurr(mBuffer), 4364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mFreeSpace(numEvents) 4464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 4564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 4664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 4764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan RajeswaranInputEventCircularReader::~InputEventCircularReader() 4864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 4964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran delete [] mBuffer; 5064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 5164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 5264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INPUT_EVENT_DEBUG (0) 5364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranssize_t InputEventCircularReader::fill(int fd) 5464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 5564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran size_t numEventsRead = 0; 5664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(INPUT_EVENT_DEBUG, 5764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd); 5864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (mFreeSpace) { 5964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event)); 6064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (nread < 0 || nread % sizeof(input_event)) { 6164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran //LOGE("Partial event received nread=%d, required=%d", 6264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran // nread, sizeof(input_event)); 6364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran //LOGE("FD trying to read is: %d"); 6464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran // we got a partial event!! 6564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (INPUT_EVENT_DEBUG) { 6664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n", 6764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran __PRETTY_FUNCTION__); 6864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(nread % sizeof(input_event), 6964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran "DEBUG:%s exit nread %% sizeof(input_event)\n", 7064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran __PRETTY_FUNCTION__); 7164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 7264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return (nread < 0 ? -errno : -EINVAL); 7364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 7464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 7564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran numEventsRead = nread / sizeof(input_event); 7664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (numEventsRead) { 7764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mHead += numEventsRead; 7864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mFreeSpace -= numEventsRead; 7964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (mHead > mBufferEnd) { 8064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran size_t s = mHead - mBufferEnd; 8164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran memcpy(mBuffer, mBufferEnd, s * sizeof(input_event)); 8264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mHead = mBuffer + s; 8364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 8464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 8564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 8664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 8764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit\n", __PRETTY_FUNCTION__); 8864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return numEventsRead; 8964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 9064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 9164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranssize_t InputEventCircularReader::readEvent(input_event const** events) 9264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 9364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran *events = mCurr; 9464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 9564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return available ? 1 : 0; 9664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 9764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 9864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranvoid InputEventCircularReader::next() 9964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 10064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mCurr++; 10164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mFreeSpace++; 10264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (mCurr >= mBufferEnd) { 10364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran mCurr = mBuffer; 10464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 10564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 106