#include <stdint.h>
#include <errno.h>
#include <unistd.h>
#include <poll.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <linux/input.h>
#include <cutils/log.h>
#include "InputEventReader.h"
/*****************************************************************************/
struct input_event;
InputEventCircularReader::InputEventCircularReader(size_t numEvents)
: mBuffer(new input_event[numEvents * 2]),//分配循环缓冲区
mBufferEnd(mBuffer + numEvents),// 循环缓冲区尾部
mHead(mBuffer), //读的头位置
mCurr(mBuffer),// 循环缓冲区当前位置
mFreeSpace(numEvents) //空闲空间
{
}
InputEventCircularReader::~InputEventCircularReader()
{
delete [] mBuffer;
}
ssize_t InputEventCircularReader::fill(int fd)
{
size_t numEventsRead = 0;
if (mFreeSpace) {
const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));//把poll事件的input_event读出来
if (nread<0 || nread % sizeof(input_event)) {
// we got a partial event!!
return nread<0 ? -errno : -EINVAL;
}
numEventsRead = nread / sizeof(input_event);//多少个input_event
if (numEventsRead) {
mHead += numEventsRead;//调整缓冲区的读头位置
mFreeSpace -= numEventsRead;//调整
if (mHead > mBufferEnd) {// 如果读 的头位置超过 缓冲区尾部
size_t s = mHead - mBufferEnd;// 计算超出的部分
memcpy(mBuffer, mBufferEnd, s * sizeof(input_event));// 把超出的部分复制缓冲区头,是循环缓冲区
mHead = mBuffer + s;// 调整缓冲区的读头位置
}
}
}
return numEventsRead;
}
ssize_t InputEventCircularReader::readEvent(input_event const** events)
{
*events = mCurr;
ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; //计算有效数据数
return available ? 1 : 0;
}
void InputEventCircularReader::next() //下一个input_event 位置
{
mCurr++;
mFreeSpace++;
if (mCurr >= mBufferEnd) {
mCurr = mBuffer;
}
}
参考和代码来自:
http://blog.csdn.net/column/details/frameworks.html
hal分析2
最新推荐文章于 2021-10-19 16:10:42 发布