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;
}
Exemple #2
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);

}