static int forward_event(struct libevdev_uinput *uidev, struct input_event *ev, struct chord* state) { int ret; enum touch t = NUM_TOUCHES; switch(ev->code){ case KEY_A: t = TOUCH_A; break; case KEY_S: t = TOUCH_S; break; case KEY_D: t = TOUCH_E; break; case KEY_F: t = TOUCH_T; break; case KEY_J: t = TOUCH_N; break; case KEY_K: t = TOUCH_I; break; case KEY_L: t = TOUCH_O; break; case KEY_SEMICOLON: t = TOUCH_P; break; } if(t < NUM_TOUCHES){ //fprintf(stderr, "current chord: 0x%02x\n", chord_state_bitmap(state)); switch(ev->value){ case 1: chord_touch_start(state, t); break; case 0: chord_touch_end(state, t); break; } if(chord_state_is_empty(state)){ lookup_key k = chord_accumulator_bitmap(state); int keycode = lookup_keycode(k); if(keycode != KEY_RESERVED){ fprintf(stderr, "chord 0x%02x %s\n", k, libevdev_event_code_get_name(EV_KEY, keycode)); ret = libevdev_uinput_write_event(uidev, EV_KEY, keycode , 1); if (ret < 0) {perror("Failed to write event"); return -1;} ret = libevdev_uinput_write_event(uidev, EV_KEY, keycode , 0); if (ret < 0) {perror("Failed to write event"); return -1;} ret = libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0); if (ret < 0) {perror("Failed to write event"); return -1;} } chord_reset(state); } } else { // printf("%s, %s, %d\n", // libevdev_event_type_get_name(ev->type), // libevdev_event_code_get_name(ev->type, ev->code), // ev->value); ret = libevdev_uinput_write_event(uidev, EV_KEY, ev->code , ev->value); if (ret < 0) {perror("Failed to write event"); return -1;} ret = libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0); if (ret < 0) {perror("Failed to write event"); return -1;} } return 0; }
END_TEST START_TEST(test_uinput_events) { struct libevdev *dev; struct libevdev_uinput *uidev; int fd, fd2; int rc; const char *devnode; int i; const int nevents = 5; struct input_event events[] = { {{0, 0}, EV_REL, REL_X, 1}, {{0, 0}, EV_REL, REL_Y, -1}, {{0, 0}, EV_SYN, SYN_REPORT, 0}, {{0, 0}, EV_KEY, BTN_LEFT, 1}, {{0, 0}, EV_SYN, SYN_REPORT, 0}}; struct input_event events_read[nevents]; dev = libevdev_new(); ck_assert(dev != NULL); libevdev_set_name(dev, TEST_DEVICE_NAME); libevdev_enable_event_type(dev, EV_SYN); libevdev_enable_event_type(dev, EV_REL); libevdev_enable_event_type(dev, EV_KEY); libevdev_enable_event_code(dev, EV_REL, REL_X, NULL); libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL); libevdev_enable_event_code(dev, EV_KEY, BTN_LEFT, NULL); fd = open(UINPUT_NODE, O_RDWR); ck_assert_int_gt(fd, -1); rc = libevdev_uinput_create_from_device(dev, fd, &uidev); ck_assert_int_eq(rc, 0); ck_assert(uidev != NULL); devnode = libevdev_uinput_get_devnode(uidev); ck_assert(devnode != NULL); fd2 = open(devnode, O_RDONLY); for (i = 0; i < nevents; i++) libevdev_uinput_write_event(uidev, events[i].type, events[i].code, events[i].value); rc = read(fd2, events_read, sizeof(events_read)); ck_assert_int_eq(rc, sizeof(events_read)); for (i = 0; i < nevents; i++) { ck_assert_int_eq(events[i].type, events_read[i].type); ck_assert_int_eq(events[i].code, events_read[i].code); ck_assert_int_eq(events[i].value, events_read[i].value); } libevdev_free(dev); libevdev_uinput_destroy(uidev); close(fd); close(fd2); }
void FTNoIR_Protocol::sendHeadposeToGame( double *headpose, double *rawheadpose ) { static const int axes[] = { /* translation goes first */ ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; static const int max_value[] = { 100, 100, 100, 180, 90, 180 }; for (int i = 0; i < 6; i++) { int value = headpose[i] * mid_input / max_value[i] + mid_input; int normalized = std::max(std::min(max_input, value), min_input); (void) libevdev_uinput_write_event(uidev, EV_ABS, axes[i], normalized); } (void) libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0); }
int main(int argc, char *argv[]) { libevdev_uinput *m_uinputDev=nullptr; libevdev *evdev=libevdev_new(); libevdev_set_name(evdev, "UnifiedKeyboardCombo virtual keyboard"); libevdev_set_id_vendor(evdev,120); libevdev_set_id_product(evdev,240); libevdev_set_id_bustype(evdev,BUS_USB); libevdev_enable_event_type(evdev, EV_KEY); //enable all key events libevdev_enable_event_code(evdev,EV_KEY,KEY_W,nullptr); int rc=libevdev_uinput_create_from_device(evdev,LIBEVDEV_UINPUT_OPEN_MANAGED, &m_uinputDev); //libevdev_free(evdev); if(rc<0){ return -1; } libevdev_uinput_write_event(m_uinputDev,EV_KEY,KEY_W,1); libevdev_uinput_write_event(m_uinputDev,EV_SYN,SYN_REPORT,0); libevdev_uinput_write_event(m_uinputDev,EV_KEY,KEY_W,0); libevdev_uinput_write_event(m_uinputDev,EV_SYN,SYN_REPORT,0); libevdev_uinput_write_event(m_uinputDev,EV_KEY,KEY_W,1); libevdev_uinput_write_event(m_uinputDev,EV_SYN,SYN_REPORT,0); libevdev_uinput_write_event(m_uinputDev,EV_KEY,KEY_W,0); libevdev_uinput_write_event(m_uinputDev,EV_SYN,SYN_REPORT,0); libevdev_uinput_destroy(m_uinputDev); }