标签: uinput

Lib(s)uinput:使用多个按钮创建操纵杆

我找不到信息,如何使用uinput/ 创建带有几个按钮的操纵杆suinput.python使用示例python-uinput:

import uinput

def main():
    events = (
        uinput.BTN_JOYSTICK,
        uinput.ABS_X + (0, 255, 0, 0),
        uinput.ABS_Y + (0, 255, 0, 0),
        )

    with uinput.Device(events) as device:
        for i in range(20):
            # syn=False to emit an "atomic" (5, 5) event.
            device.emit(uinput.ABS_X, 5, syn=False)
            device.emit(uinput.ABS_Y, 5)
        device.emit_click(uinput.BTN_JOYSTICK)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

如您所见,在此示例中使用BTN_JOYSTICKas按钮.如何创建第二个按钮/上瘾两个ABS_X/ ABS_Y

注:我使用python为例,应用语言是Clibsuinput.

c linux uinput

7
推荐指数
1
解决办法
1409
查看次数

无法使用“uinput”模块创建设备文件。Windows 版 Ubuntu 上的 Python3

我有一个在 python3.4 上运行的 python 脚本,并使用该包keyboard来允许按键绑定;

keyboard.add_hotkey("enter", self.listener.stop, suppress=True)
keyboard.add_hotkey("shift+enter", self.listener.finish, suppress=True)
Run Code Online (Sandbox Code Playgroud)

当我在 Windows 上运行它时,它可以完美地监听两个热键,当在 Linux (CentOS) 上运行时它也可以工作。

在工作中,我通过 Windows 10 功能和应用商店在 Windows 上获得了 Ubuntu 环境。但是这个环境下这个键盘热键有问题。

/usr/local/lib/python3.6/dist-packages/keyboard-0.13.2-py3.6.egg/keyboard/_nixkeyboard.py:110: UserWarning: Failed to create a device file using `uinput` module. Sending of events may be limited or unavailable depending on plugged-in devices.
  device = aggregate_devices('kbd')
Traceback (most recent call last):
  File "main.py", line 32, in <module>
    ], 'test')
  File "/mnt/.../can_controller.py", line 28, in __init__
    self.__initialise_key_handler()
  File "/mnt/.../can_controller.py", line 95, in __initialise_key_handler
    keyboard.add_hotkey("enter", …
Run Code Online (Sandbox Code Playgroud)

keyboard ubuntu python-3.x uinput windows-subsystem-for-linux

6
推荐指数
0
解决办法
1645
查看次数

将epoll用于设备(​​/ dev/event/...)是否有效?

我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad); 我设法使用uinput接口创建它,我正确设置它并且它工作得很好.

为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这些标志打开真实的设备文件:

fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad
Run Code Online (Sandbox Code Playgroud)

主循环类似于(减去错误检查):

while(run) {
    input_event ev = {0};
    read(fd, &ev, sizeof(struct input_event));
    // convert from PS3 --> Xbox 360
    convert(ev);
    // write to the new virtual pad
    write(fd_virtual, &ev, sizeof(struct input_event));
}
Run Code Online (Sandbox Code Playgroud)

你可以想象这read(fd, &ev, sizeof(struct input_event));是一个阻塞调用,我希望有一种超时循环循环并检查其他事件/执行其他代码.

由于这些原因,我想read(fd...epoll循环中封装该调用,所以我也可以暂停.

问题是,以这种方式完成它会有效吗?通过使用epoll_wait,我是否会对当前循环引入额外的延迟,从而延迟虚拟键盘的响应能力?

linux epoll event-handling linux-device-driver uinput

5
推荐指数
1
解决办法
452
查看次数

linux uinput:简单的例子?

我在使用工作时获得代码的两面遇到了一些问题uinput.

基于uinput入门:用户级输入子系统[死链接; 存档 ]我总结了以下作家(减去错误处理):

int main(int ac, char **av)
{
    int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    int ret = ioctl(fd, UI_SET_EVBIT, EV_ABS);
    ret = ioctl(fd, UI_SET_ABSBIT, ABS_X);

    struct uinput_user_dev uidev = {0};
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-rotary");
    uidev.absmin[ABS_X] = 0;
    uidev.absmax[ABS_X] = 255;
    ret = write(fd, &uidev, sizeof(uidev));
    ret = ioctl(fd, UI_DEV_CREATE);

    struct input_event ev = {0};
    ev.type = EV_ABS;
    ev.code = ABS_X;
    ev.value = 42;

    ret = write(fd, &ev, sizeof(ev));

    getchar(); …
Run Code Online (Sandbox Code Playgroud)

linux uinput

4
推荐指数
1
解决办法
6133
查看次数

如何获取uinput创建的设备的名称(路径)

我已成功设置一个小程序来创建一个设备,我打算用它来自动测试接收键盘输入事件的应用程序.

我已经按照这个非常好的答案中的两个 教程进行了操作.

当我的程序通过调用ioctl(fd, UI_DEV_CREATE)新设备创建uinput设备出现在文件系统中时,我的测试应用程序可以附加到它并等待事件.我的目标系统已经有了一个/dev/input/event0设备,所以新的设备获得了路径/dev/input/event1.如果我为我的桌面系统编译并运行程序,那里有现有设备/dev/input/event[0-15],当程序运行时,新设备就会获得/dev/input/event16.

我希望我的程序在创建后报告新设备名称.有办法搞定吗?

c linux linux-device-driver linux-kernel uinput

4
推荐指数
1
解决办法
1260
查看次数

OSError:[Errno 19]无法打开uinput设备:没有这样的设备

我对树莓派和Linux很陌生。我正在尝试使用以下代码在Raspbian(r Pi 3 B)上运行python库uinput的基本示例:

import uinput

device = uinput.Device([
        uinput.BTN_LEFT,
        uinput.BTN_RIGHT,
        uinput.REL_X,
        uinput.REL_Y,
        ])

for i in range(20):
    device.emit(uinput.REL_X, 5)
    device.emit(uinput.REL_Y, 5)
Run Code Online (Sandbox Code Playgroud)

我得到错误:

追溯(最近一次通话):

文件“/home/pi/Desktop/t1.py”,7号线,在uinput.REL_Y,文件“/home/pi/.local/lib/python3.5/site-packages/uinput/ 初始化的.py”,行178,初始化 自己。uinput_fd = fd或fdopen()文件“ /home/pi/.local/lib/python3.5/site-packages/uinput/__init .py”,第84行,在fdopen中返回_libsuinput.suinput_open()文件“ / home / pi / .local / lib / python3.5 / site-packages / uinput / init .py“,第70行,在_open_error_handler中引发OSError(code,msg)

OSError:[Errno 19]无法打开uinput设备:否这样的设备怎么了?我需要更改什么,在哪里更改?

python linux raspbian uinput

0
推荐指数
1
解决办法
3042
查看次数