EventHub

EventHub的构造函数中:

mEpollFd = epoll_create(EPOLL_SIZE_HINT);

mINotifyFd = inotify_init();

//DEVICE_PATH定义为"/dev/input"

int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);

result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem);


result = pipe(wakeFds);

mWakeReadPipeFd = wakeFds[0];
mWakeWritePipeFd = wakeFds[1];

result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);

result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);

result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &eventItem);


InputReaderThread通过循环调用EventHub的getEvents()函数获取输入事件。

EventHub::getEvents() 函数功能

 1. 初次启动或者配置改变时,重新扫描设备,加载设备配置信息。

scanDevicesLocked();

 2. 执行epoll_wait 监听设备节点,如果监听到设备节点有变化,则登记设备节点到pending 列表;否则阻塞等待。

 int pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, timeoutMillis);

按键按下

mP mPendingEventCount=1

/dev/input/event0 got: t0=658, t1=765679, type=1, code=1, value=0
/dev/input/event0 got: t0=658, t1=765694, type=0, code=0, value=0


按键松开

mPmPendingEventCount=1

/dev/input/event0 got: t0=658, t1=765679, type=1, code=1, value=0
/dev/input/event0 got: t0=658, t1=765694, type=0, code=0, value=0

3. 把pending 列表里的event 里记录的设备节点,读取节点数据,并保存到buffer里返回给调用者。

4. 如果读取到event,则退出for循环,把event数据返回给调用则。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值