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 <stdint.h> 18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <errno.h> 19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <unistd.h> 20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <poll.h> 21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <sys/cdefs.h> 23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <sys/types.h> 24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <linux/input.h> 26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <cutils/log.h> 28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "InputEventReader.h" 30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastruct input_event; 34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi MasudaInputEventCircularReader::InputEventCircularReader(size_t numEvents) 36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda : mBuffer(new input_event[numEvents * 2]), 37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mBufferEnd(mBuffer + numEvents), 38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mHead(mBuffer), 39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mCurr(mBuffer), 40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mFreeSpace(numEvents) 41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi MasudaInputEventCircularReader::~InputEventCircularReader() 45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda delete [] mBuffer; 47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudassize_t InputEventCircularReader::fill(int fd) 50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda size_t numEventsRead = 0; 52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (mFreeSpace) { 53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event)); 54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (nread<0 || nread % sizeof(input_event)) { 55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // we got a partial event!! 56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return nread<0 ? -errno : -EINVAL; 57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda numEventsRead = nread / sizeof(input_event); 60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (numEventsRead) { 61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mHead += numEventsRead; 62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mFreeSpace -= numEventsRead; 63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (mHead > mBufferEnd) { 64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda size_t s = mHead - mBufferEnd; 65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda memcpy(mBuffer, mBufferEnd, s * sizeof(input_event)); 66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mHead = mBuffer + s; 67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 69ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return numEventsRead; 72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudassize_t InputEventCircularReader::readEvent(input_event const** events) 75ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *events = mCurr; 77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; 78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return available ? 1 : 0; 79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 80ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudavoid InputEventCircularReader::next() 82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mCurr++; 84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mFreeSpace++; 85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (mCurr >= mBufferEnd) { 86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mCurr = mBuffer; 87ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 89