diff --git a/hanvon-libusb.c b/hanvon-libusb.c index c8c7c59..9a9da69 100644 --- a/hanvon-libusb.c +++ b/hanvon-libusb.c @@ -112,7 +112,7 @@ void display_packets(const unsigned char* buf) { for(int i = 0; i < AM_PACKET_LEN; i++) { fprintf(stderr,"0x%x, ", buf[i]); } - fprintf(stderr,"\n"); + fprintf(stderr,"\r"); } void callback(struct libusb_transfer *transfer) { @@ -137,8 +137,10 @@ void callback_gp0504 (struct libusb_transfer *tx) { // for callback 0x02: button press 0x01: touching */ - if(msg->is_move & (0x80|0x10)) - { + err = libevdev_uinput_write_event( + ud, EV_KEY, BTN_TOOL_PEN, msg->is_move & (0x80|0x10)); + if(err) { DEBUG("err: %d\n",err); } + if(msg->is_move & (0x80|0x10)) { msg->x_movement = htobe16(msg->x_movement); //DEBUG("Set X to %x\n",msg->x_movement); err = libevdev_uinput_write_event(ud, EV_ABS, ABS_X, msg->x_movement); @@ -148,29 +150,17 @@ void callback_gp0504 (struct libusb_transfer *tx) { // for callback err = libevdev_uinput_write_event(ud, EV_ABS, ABS_Y, msg->y_movement); if(err) { DEBUG("err: %d\n",err); } } + err = libevdev_uinput_write_event( + ud, EV_ABS, ABS_PRESSURE, msg->pressure); + if(err) { DEBUG("err: %d\n",err); } err = libevdev_uinput_write_event(ud, EV_KEY, BTN_LEFT, msg->is_move & 0x01); if(err) { DEBUG("err: %d\n",err); } - err = libevdev_uinput_write_event(ud, EV_KEY, BTN_RIGHT, msg->is_move & 0x02); + err = libevdev_uinput_write_event( + ud, EV_KEY, BTN_RIGHT, (msg->is_move & 0x02) / 2); if(err) { DEBUG("err: %d\n",err); } - // pen touches surface - //err += libevdev_uinput_write_event(ud, EV_KEY, BTN_LEFT, data[6] > 68); // data[1]: // 0x10 = lift, 0x90 = close, 0x91 = press // 0x12 = btn (lift), 0x92 = btn (close), 0x93 = btn (press) - //err += libevdev_uinput_write_event(ud, EV_KEY, BTN_RIGHT, data[1] & 0x02); -// if((data[1] & 0xf0) != 0) { -// //absolute x -// temp = data[2]; -// temp <<= 8; -// temp += data[3]; -// err += libevdev_uinput_write_event(ud, EV_ABS, ABS_X, temp); -// //absolute y -// temp = data[4]; -// temp <<= 8; -// temp += data[5]; -// err += libevdev_uinput_write_event(ud, EV_ABS, ABS_Y, temp); -// } - //else { display_packets(data); } @@ -198,10 +188,12 @@ int init_ctrl(struct libusb_device * const d, struct libevdev **evdev, struct li struct libusb_device_descriptor desc; libusb_get_device_descriptor(d, &desc); (*evdev) = libevdev_new(); + libevdev_enable_property((*evdev), INPUT_PROP_DIRECT); libevdev_enable_event_type((*evdev), EV_SYN); libevdev_enable_event_code((*evdev), EV_SYN, SYN_REPORT, NULL); // every tablet has these features libevdev_enable_event_type((*evdev), EV_KEY); // enable pen button + libevdev_enable_event_code((*evdev), EV_KEY, BTN_TOOL_PEN, NULL); libevdev_enable_event_code((*evdev), EV_KEY, BTN_LEFT, NULL); // pen tap libevdev_enable_event_code((*evdev), EV_KEY, BTN_RIGHT, NULL); // pen button @@ -228,6 +220,13 @@ int init_ctrl(struct libusb_device * const d, struct libevdev **evdev, struct li { DEBUG("%s","failed to register absolute x\n"); } + abs -> value = 0; + abs -> minimum = 0; + abs -> maximum = 0xff; + abs -> resolution = 0; + if(libevdev_enable_event_code((*evdev), EV_ABS, ABS_PRESSURE, abs)<0) { + DEBUG("%s","failed to register pressure\n"); + } switch(desc.idProduct) { case PRODUCT_ID_GP0504: libevdev_set_name((*evdev), "Hanvon Graphicpal GP0504");