当前位置: 首页 > 工具软件 > EventHub > 使用案例 >

EventHub

葛智敏
2023-12-01

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数据返回给调用则。



 类似资料: