1 #include "event_device.h"
7 #include <linux/input.h>
11 #include <sys/ioctl.h>
14 #include <QApplication>
22 EventDevice::EventDevice(const std::set<std::pair<unsigned, unsigned>> &accepted_usb_ids, QObject *receiver)
23 : accepted_usb_ids(accepted_usb_ids), receiver(receiver)
28 void EventDevice::init()
30 /* scan /dev/input for event devices */
31 DIR *dir = opendir("/dev/input");
34 struct input_id found_id;
42 while ((de = readdir(dir))) {
43 if (strncmp(de->d_name, "event", 5) != 0)
46 sprintf(path, "/dev/input/%s", de->d_name);
47 fd = open(path, O_RDONLY);
49 fprintf(stderr, "Warning, skipping %s: %s\n",
50 path, strerror(errno));
53 if (ioctl(fd, EVIOCGID, &id) == -1) {
54 fprintf(stderr, "ioctl on %s: %s\n",
55 path, strerror(errno));
59 if (accepted_usb_ids.count({ id.vendor, id.product }) != 0) {
73 ioctl(fd, EVIOCGNAME(255), name);
75 fprintf(stderr, "Found device (%04x,%04x) at %s: \"%s\"\n",
76 found_id.vendor, found_id.product, path, name);
78 fprintf(stderr, "Could not find the USB device\n");
82 void EventDevice::start_thread()
84 thr = thread(&EventDevice::thread_func, this);
88 void EventDevice::thread_func()
90 struct input_event iev;
95 ret = read(fd, &iev, sizeof(iev));
96 if (ret != sizeof(iev)) {
107 if (iev.type != EV_KEY)
112 QEvent *event = nullptr;
115 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0");
118 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_1, Qt::NoModifier, "1");
121 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_2, Qt::NoModifier, "2");
124 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_3, Qt::NoModifier, "3");
127 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_4, Qt::NoModifier, "4");
130 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_5, Qt::NoModifier, "5");
133 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_6, Qt::NoModifier, "6");
136 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_7, Qt::NoModifier, "7");
139 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_8, Qt::NoModifier, "8");
142 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9");
145 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::ShiftModifier, "A");
148 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::ShiftModifier, "B");
151 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_C, Qt::ShiftModifier, "C");
154 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_D, Qt::ShiftModifier, "D");
157 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_E, Qt::ShiftModifier, "E");
160 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_F, Qt::ShiftModifier, "F");
163 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
166 event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
170 QApplication::postEvent(receiver, event);
172 // printf("iev.type=%d iev.value=%d iev.code=%d\n", iev.type, iev.value, iev.code);